In dieser Frage wird ein einfaches Markov-Modell verwendet. Weitere Informationen zu Markov-Ketten finden Sie unter http://setosa.io/ev/markov-chains/ .
Nimm eine Schnur. In diesem Beispiel verwenden wir das Wort:
reader
Nehmen Sie nun für jedes Zeichen die Zeichen, die nach jedem Auftreten des Zeichens in der Zeichenfolge erscheinen. ( `^`
Stellt den Anfang der Zeichenfolge und `$`
das Ende dar)
`^` -> {'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'}
Wählen Sie nun, beginnend mit dem Anfang der Zeichenfolge, zufällig eines der Zeichen im nächsten Satz aus. Hängen Sie dieses Zeichen an und wählen Sie dann aus den Zeichen der nächsten Gruppe usw. aus, bis Sie das Ende erreicht haben. Hier sind einige Beispielwörter:
r
rereader
rer
readereader
Wenn ein Zeichen mehrmals nach einem anderen Zeichen erscheint, ist es wahrscheinlicher, dass es ausgewählt wird. Zum Beispiel besteht cocoa can
nach a c
eine Wahrscheinlichkeit von zwei Dritteln und eine Wahrscheinlichkeit von o
einem Drittel a
.
'c' -> {'o', 'o', 'a'}
Herausforderung
Erstellen Sie ein Programm, das keine Eingabe akzeptiert und eine zufällige Zeichenfolge ausgibt, die mit einer Markov-Kette wie oben generiert wurde, wobei die Eingabe in die Kette die Quelle des Programms ist.
- Das Programm muss aus mindestens zwei Zeichen bestehen, von denen zwei gleich sein müssen (um zu verhindern, dass Ketten langweilig werden, die nur eine Ausgabe haben)
- Sie können das Modell so ändern, dass Bytes anstelle von Zeichen verwendet werden. Ändern Sie jedoch in Regel 1 "Zeichen" in "Bytes"
- Das Programm sollte Strings zufällig mit der theoretisch erwarteten Häufigkeit ausgeben
Das ist Code-Golf , also gewinnt das kürzeste Programm!
^
und $
in Anführungszeichen? es könnte klarer sein, es aus Anführungszeichen zu entfernen oder sie in Anführungszeichen zu setzen.