Um modelo simples de Markov será usado nesta pergunta. Para mais informações sobre cadeias de Markov, consulte http://setosa.io/ev/markov-chains/ .
Pegue uma corda. Neste exemplo, usaremos a palavra:
reader
Agora, para cada caractere, pegue os caracteres que aparecem após cada ocorrência do caractere na sequência. ( `^`
representa o início da string e `$`
o fim)
`^` -> {'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'}
Agora, começando do início da string, escolha aleatoriamente um dos caracteres no próximo conjunto. Anexe esse personagem e, em seguida, escolha entre os caracteres em seu próximo conjunto e assim sucessivamente até chegar ao final. Aqui estão alguns exemplos de palavras:
r
rereader
rer
readereader
Se um personagem aparecer após outro personagem várias vezes, é mais provável que ele seja escolhido. Por exemplo, em cocoa can
, após a c
, há dois terços de uma chance de obter uma o
e um terço de uma chance de obter uma a
.
'c' -> {'o', 'o', 'a'}
Desafio
Crie um programa que não aceite nenhuma entrada e produza uma sequência aleatória gerada usando uma cadeia de Markov, como acima, em que a entrada na cadeia é a fonte do programa.
- O programa deve ter pelo menos dois caracteres, dois dos quais devem ser iguais (para evitar cadeias "chatas" que possuem apenas uma saída)
- Você pode modificar o modelo para usar bytes em vez de caracteres, se desejar, mas altere "caracteres" para "bytes" na regra 1
- O programa deve gerar seqüências de caracteres aleatoriamente com a frequência esperada em teoria
Isso é código-golfe , então o programa mais curto vence!
^
e $
entre aspas? pode ficar mais claro tirar aspas ou colocá-las em aspas.