In questa domanda verrà utilizzato un semplice modello Markov. Per ulteriori informazioni sulle catene Markov, vedere http://setosa.io/ev/markov-chains/ .
Prendi una corda. Per questo esempio, useremo la parola:
reader
Ora, per ogni personaggio, prendi i caratteri che compaiono dopo ogni occorrenza del carattere nella stringa. ( `^`
rappresenta l'inizio della stringa e `$`
rappresenta la fine)
`^` -> {'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'}
Ora, a partire dall'inizio della stringa, scegli casualmente uno dei caratteri del set successivo. Aggiungi questo personaggio e poi scegli tra i personaggi nel suo prossimo set, e così via fino ad arrivare alla fine. Ecco alcune parole di esempio:
r
rereader
rer
readereader
Se un personaggio appare dopo un altro personaggio più volte, è più probabile che venga scelto. Ad esempio, in cocoa can
, dopo a c
, ci sono due terzi della possibilità di ottenere un o
e un terzo della possibilità di ottenere un a
.
'c' -> {'o', 'o', 'a'}
Sfida
Crea un programma che non accetta input e genera una stringa casuale generata utilizzando una catena di Markov, come sopra, in cui l'input della catena è l'origine del programma.
- Il programma deve avere almeno due caratteri, due dei quali devono essere uguali (per evitare catene "noiose" che hanno un solo output)
- Se lo desideri, puoi modificare il modello in modo da utilizzare i byte anziché i caratteri, ma modifica i "caratteri" in "byte" nella regola 1
- Il programma dovrebbe produrre stringhe casualmente con la frequenza prevista in teoria
Questo è code-golf , quindi vince il programma più corto!
^
e $
tra virgolette? potrebbe essere più chiaro estrarlo dalle virgolette o inserirle tra virgolette.