Se utilizará un modelo de Markov simple en esta pregunta. Para obtener más información sobre las cadenas de Markov, consulte http://setosa.io/ev/markov-chains/ .
Toma una cuerda. Para este ejemplo, usaremos la palabra:
reader
Ahora, para cada carácter, tome los caracteres que aparecen después de cada aparición del carácter en la cadena. ( `^`representa el inicio de la cadena y `$`representa el final)
`^` -> {'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'}
Ahora, comenzando desde el comienzo de la cadena, elija aleatoriamente uno de los personajes del siguiente conjunto. Agregue este personaje y luego elija entre los personajes en su próximo conjunto, y así sucesivamente hasta llegar al final. Aquí hay algunas palabras de ejemplo:
r
rereader
rer
readereader
Si un personaje aparece después de otro personaje varias veces, es más probable que sea elegido. Por ejemplo, en cocoa can, después de un c, hay dos tercios de posibilidades de obtener un oy un tercio de posibilidades de obtener un a.
'c' -> {'o', 'o', 'a'}
Desafío
Cree un programa que no tome entrada y genere una cadena aleatoria generada usando una Cadena de Markov, como arriba, donde la entrada a la cadena es la fuente del programa.
- El programa debe tener al menos dos caracteres, dos de los cuales deben ser iguales (para evitar cadenas "aburridas" que solo tienen una salida)
- Puede modificar el modelo para usar bytes en lugar de caracteres si lo desea, pero cambie "caracteres" a "bytes" en la regla 1
- El programa debería generar cadenas al azar con la frecuencia esperada en teoría
Este es el código de golf , por lo que gana el programa más corto.
^y $entre comillas? puede que sea más claro eliminarlo de las comillas o ponerlas entre comillas.