В этом вопросе будет использована простая модель Маркова. Для получения дополнительной информации о цепях Маркова см. Http://setosa.io/ev/markov-chains/ .
Возьми строку. Для этого примера мы будем использовать слово:
reader
Теперь для каждого символа возьмите символы, которые появляются после каждого вхождения символа в строке. ( `^`
представляет начало строки и `$`
представляет конец)
`^` -> {'r'} # After the start of the string, there is an `r`.
'r' -> {'e', `$`} # After the first `r` (*r*eader), there is an `e`
# after the second (reade*r*), there is the end of the string.
'e' -> {'a', 'r'}
'a' -> {'d'}
'd' -> {'e'}
Теперь, начиная с начала строки, выберите случайным образом один из символов в следующем наборе. Добавьте этот символ, а затем выберите его из следующего набора и так далее, пока не дойдете до конца. Вот несколько примеров слов:
r
rereader
rer
readereader
Если персонаж появляется после другого символа несколько раз, он более вероятен. Например, cocoa can
после a c
есть две трети шансов получить o
и одна треть шансов получить a
.
'c' -> {'o', 'o', 'a'}
Вызов
Создайте программу, которая не требует ввода и выводит случайную строку, сгенерированную с использованием цепочки Маркова, как описано выше, где вход в цепочку является источником программы.
- В программе должно быть как минимум два символа, два из которых должны быть одинаковыми (чтобы предотвратить «скучные» цепочки, которые имеют только один вывод)
- Вы можете изменить модель, чтобы использовать байты вместо символов, если хотите, но измените «символы» на «байты» в правиле 1
- Программа должна выводить строки случайным образом с ожидаемой частотой в теории
Это код-гольф , поэтому выигрывает самая короткая программа!
^
и $
в кавычках? это могло бы сделать более понятным удаление из кавычек или размещение их в обратных кавычках.