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 o
y 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.