У цьому питанні буде використана проста модель Маркова. Для отримання додаткової інформації про Маркові ланцюги див. 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
після, після c
, є дві третини шансів отримати o
та одну третину шансів отримати a
.
'c' -> {'o', 'o', 'a'}
Виклик
Створіть програму, яка не приймає даних і виводить випадкову рядок, згенерований за допомогою ланцюга Маркова, як вище, де вхід до ланцюга є джерелом програми.
- Програма повинна мати щонайменше два символи, два з яких повинні бути однаковими (Для запобігання "нудним" ланцюжків, які мають лише один вихід)
- Ви можете змінити модель, щоб використовувати байти замість символів, якщо хочете, але змінити "символи" на "байти" у правилі 1
- Програма повинна виводити рядки випадковим чином із очікуваною частотою теоретично
Це код-гольф , тому найкоротша програма виграє!
^
і $
в лапках? можливо, буде чіткіше вийняти це з лапок або помістити їх у зворотні цитати.