Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3

2 грамма Цепь Маркова

25.01.2023, 13:11. Показов 513. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день
есть задача https://www.codingame.com/ide/... generation [Width 2]
на входе stop there once was a girl named dorothy stop dorothy had a dog named toto stop dorothy lived with her aunt and uncle with her dog named toto stop she was a girl of who dreamed of traveling stop
Из которой составляем цепь. Получаются все уникальные кроме "a girl" => {"named", "of"}
стартововая строка "dorothy was a girl"
Вероятность выбора задана такой функцией
C++
1
2
3
4
5
random_seed = 0
function pick_option_index( num_of_options ) {
    random_seed += 7
    return random_seed % num_of_options
}
Исходя из которой в случае a girl у нас выходит of
а в задаче правильное решение считается named

Почему?
или я неправильно понял условие?

у меня выходит строка - dorothy was a girl of who dreamed of traveling stop
а у них - dorothy was a girl named dorothy stop dorothy had a
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.01.2023, 13:11
Ответы с готовыми решениями:

Цепь Маркова
Мне надо написать программу, которая будет имитировать работу цепи Маркова. Есть ли готовые алгоритмы? В заранее благодарен.

Цепь Маркова
Собственно, стоит ли на неё обращать внимание? Глава из "Практики Кернигана" довольно обширная.

Цепь Маркова
Привет участникам форума) Работаю над учебным проектом по созданию Системы Массового Обслуживания, имеются некоторые вопросы, могли бы вы...

4
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
25.01.2023, 14:09
для случаев с одним вариантом pick_option_index вызывается? должен вызываться и сид должен быть увеличен как при соответствующем количестве слов.

Добавлено через 9 минут
Code
1
2
3
random_seed=0
random_seed=7; "was a" => opt={girl} 7%1=0 => girl
random_seed=14; "a girl" => opt={named, of} 14%2=0 =>named
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
25.01.2023, 14:46  [ТС]
Kuzia domovenok, а точно! семен семеныч
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
26.01.2023, 17:15
alexbmd, vector<string> оказывается можно использовать как ключ в мапе? Да я для этого целый класс написал с компараторами для мап!
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
29.01.2023, 12:02  [ТС]
Kuzia domovenok,
яж на си, на ООП и на языках функция-точка-функция (руби,питон,..) всяко полегче/поменьше кода должно быть

markov chain
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int len;
typedef struct {
  unsigned key;
  char *val[3];
  unsigned char num;
} Chain;
 
unsigned fnv_32a(char *s, char *e) {
  unsigned hash = 0; // 0x811C9DC5, 0xEDB88320
  if (*s == 32) s++;
  while (s < e) {
    // fprintf(stderr, ":%u", *s);
    hash ^= *s++;
    hash *= 0x01000193;
  }
  return hash;
}
 
int exist_key(unsigned key, int len, Chain *chain) {
  for (int i = 0; i < len; i++) if (chain[i].key == key) return i;
  return -1;
}
 
Chain *make_chain(char *t, char *t2, int d, int *len) {
  char *e = t;
  unsigned char ptr[100] = {0}, words = 1; // count of words
  while (*e++) if (*e == ' ') ptr[words++] = e - t;
  ptr[words] = e - t - 1;
  *len = words - d; // lenght of chain
  Chain *chain = (Chain *)calloc(*len, sizeof(Chain));
 
  for (int x = 0, i = 0, j = d; i < *len; i++, j++) {
    unsigned key = fnv_32a(t + ptr[i], t + ptr[j]); // n-gram text as key
    int id = exist_key(key, *len, chain);
    *(t2 + ptr[j + 1]) = 0; // end of key value. next word after key is value
 
    if (id != -1) { // if key exist
      int val_id = 1;
      while (chain[id].val[val_id] != NULL)
        val_id++;
      chain[id].val[val_id] = t2 + ptr[j] + 1; // value of key
      // fprintf(stderr, " +%d %s\n", id, chain[id].val[val_id]);
      chain[id].num = ++val_id;
      continue;
    }
    chain[x].key = key;
    chain[x].num = 1;
    chain[x++].val[0] = t2 + ptr[j] + 1; // value of key
    // fprintf(stderr, " %s\n", chain[x - 1].val[0]);
  }
  return chain;
}
 
int pick_option_index(int num) {
  static unsigned random_seed = 0;
  random_seed += 7;
  return random_seed % num;
}
 
void get_chain(char *t, int d, int len, Chain *chain) {
  static char *e = NULL; // to increase speed of adding words from chain
  if (e == NULL) e = t;
  static unsigned char ptr[100] = {0}, words = 1; // count of words
  while (*e++) if (*e == ' ') ptr[words++] = e - t;
  ptr[words] = e - t - 1;
  // for (int i = 0; i <= words; i++) fprintf(stderr, "%u \n", ptr[i]);
  unsigned key = fnv_32a(t + ptr[words - d], t + ptr[words]); // n-gram text as key
  int id = exist_key(key, len, chain);
  if (id >= 0) {
    strcat(t, " ");
    int val_id = pick_option_index(chain[id].num);
    strcat(t, chain[id].val[val_id]);
    words++;
  }
}
 
int need_add(char *e, int l) {
  unsigned char words = 1; // count of words
  while (*e++) if (*e == ' ') words++;
  return l - words; // is need to add words
}
 
int main() {
  char t[1001]; // array of key
  scanf("%[^\n]", t);
  char t2[strlen(t) + 1]; // array of value
  strcpy(t2, t);
  int d; // n-gram
  scanf("%d", &d);
  int len; // lenght of chain
  Chain *chain = make_chain(t, t2, d, &len);
 
  int l; // length of outputed words
  scanf("%d", &l);
  fgetc(stdin);
  char s[1001]; // initial string
  scanf("%[^\n]", s);
  int add = need_add(s, l); // words
  for (int i = 0; i < add; i++) {
    get_chain(s, d, len, chain); // adding words
    // fprintf(stderr, "\n%s \n", s);
  }
 
  printf("%s\n", s);
  free(chain);
  return 0;
}


интересно кто еще, на Си или PHP и других "простых" языках решил ?

PS: я новичок. у меня мне не нравится повторяющийся кусок подсчета слов, наверно можно оптимизировать. в остальном вроде взрослый код получился, как считаете?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.01.2023, 12:02
Помогаю со студенческими работами здесь

Цепь Маркова
Добрый день! Подскажите пожалуйста, как решать следующее задание: Задана матрица вероятностей перехода для цепи Маркова за один...

Цепь Маркова
Помогите пожалуйста решить задачу: Дана Переходная матрица. Установить эргодичность цепи и найти финальные матрицы

Цепь Маркова граф состояний системы
Здравствуйте, у меня задача цепь Маркова с тремя состояниями с1 с2 с3, характеризуется однородной стохастической матрицей 3х3. начальное...

Проверить/исправить цепь Маркова для структурной схемы надежности системы
Мною нарисована следующая структурная схема надежности: На данной схеме различимы три блока: автоматизированное рабочее...

Цепь Маркова с заданным числом "попаданий" в состояние
Добрый вечер! Нашёл занимательную, на мой взгляд, задачу. Бьюсь два дня, но пока даже примерное направление решения найти не могу. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru