W tym pytaniu zostanie zastosowany prosty model Markowa. Aby uzyskać więcej informacji o łańcuchach Markowa, zobacz http://setosa.io/ev/markov-chains/ .
Weź sznurek. W tym przykładzie użyjemy słowa:
reader
Teraz dla każdego znaku weź znaki, które pojawiają się po każdym wystąpieniu znaku w ciągu. ( `^`reprezentuje początek ciągu i `$`reprezentuje koniec)
`^` -> {'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'}
Teraz, zaczynając od początku ciągu, wybierz losowo jedną z postaci w następnym zestawie. Dołącz tę postać, a następnie wybieraj postacie z następnego zestawu i tak dalej, aż dojdziesz do końca. Oto kilka przykładowych słów:
r
rereader
rer
readereader
Jeśli postać pojawia się wielokrotnie za inną postacią, jest bardziej prawdopodobne, że zostanie wybrana. Na przykład, cocoa canpo c, istnieje dwie trzecie szans na uzyskanie oi jedna trzecia szansy na uzyskanie a.
'c' -> {'o', 'o', 'a'}
Wyzwanie
Utwórz program, który nie pobiera danych wejściowych i generuje losowy ciąg wygenerowany za pomocą łańcucha Markowa, jak powyżej, gdzie dane wejściowe do łańcucha są źródłem programu.
- Program musi mieć co najmniej dwa znaki, z których dwa muszą być takie same (aby zapobiec „nudnym” łańcuchom, które mają tylko jedno wyjście)
- Możesz zmodyfikować model, aby używać bajtów zamiast znaków, jeśli chcesz, ale zmień „znaki” na „bajty” w regule 1
- Program powinien wyprowadzać ciągi losowo z teoretyczną częstotliwością oczekiwaną
To jest golf golfowy , więc wygrywa najkrótszy program!
^i $w cudzysłowie? może to uczynić bardziej zrozumiałym wyciąganie go z cytatów lub umieszczanie ich w cudzysłowie.