Un modèle de Markov simple sera utilisé dans cette question. Pour plus d'informations sur les chaînes de Markov, voir http://setosa.io/ev/markov-chains/ .
Prenez une ficelle. Pour cet exemple, nous utiliserons le mot:
reader
Maintenant, pour chaque caractère, prenez les caractères qui apparaissent après chaque occurrence du caractère dans la chaîne. ( `^`
représente le début de la chaîne et `$`
représente la fin)
`^` -> {'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'}
Maintenant, à partir du début de la chaîne, choisissez aléatoirement l'un des caractères du jeu suivant. Ajoutez ce personnage, puis choisissez parmi les personnages de son prochain ensemble, et ainsi de suite jusqu'à la fin. Voici quelques exemples de mots:
r
rereader
rer
readereader
Si un personnage apparaît plusieurs fois après un autre personnage, il est plus susceptible d'être choisi. Par exemple, dans cocoa can
, après un c
, il y a deux tiers de chance d'obtenir un o
et un tiers de chance d'obtenir un a
.
'c' -> {'o', 'o', 'a'}
Défi
Créez un programme qui ne prend aucune entrée et génère une chaîne aléatoire générée à l'aide d'une chaîne de Markov, comme ci-dessus, où l'entrée de la chaîne est la source du programme.
- Le programme doit avoir au moins deux caractères, dont deux doivent être identiques (pour éviter les chaînes "ennuyeuses" qui n'ont qu'une seule sortie)
- Vous pouvez modifier le modèle pour utiliser des octets au lieu de caractères si vous le souhaitez, mais changer "caractères" en "octets" dans la règle 1
- Le programme devrait produire des chaînes de façon aléatoire avec la fréquence attendue en théorie
C'est du golf de code , donc le programme le plus court gagne!
^
et $
entre guillemets? il pourrait être plus clair de le retirer des guillemets ou de les mettre en guillemets.