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 can
po c
, istnieje dwie trzecie szans na uzyskanie o
i 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.