この質問では、単純なマルコフモデルを使用します。マルコフ連鎖の詳細については、http: //setosa.io/ev/markov-chains/を参照してください。
文字列を取ります。この例では、次の単語を使用します。
reader
次に、文字ごとに、文字列内の文字が出現するたびに表示される文字を取得します。(`^`
文字列の開始と`$`
終了を表します)
`^` -> {'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'}
次に、文字列の先頭から始めて、次のセットの文字の1つからランダムに選択します。この文字を追加し、次のセットの文字から選択し、最後まで取得するまで続けます。以下に単語の例を示します。
r
rereader
rer
readereader
文字が別の文字の後に複数回現れる場合、選択される可能性が高くなります。たとえば、ではcocoa can
、の後に、c
を取得する可能性が3分の2あり、を取得するo
可能性が3分の1ありますa
です。
'c' -> {'o', 'o', 'a'}
チャレンジ
上記のように、入力を受け取らず、マルコフ連鎖を使用して生成されたランダム文字列を出力するプログラムを作成します。ここで、連鎖への入力はプログラムのソースです。
- プログラムには少なくとも2つの文字が必要です。そのうちの2つは同じでなければなりません(出力が1つしかない「退屈な」チェーンを防ぐため)
- 必要に応じて、文字の代わりにバイトを使用するようにモデルを変更できますが、ルール1で「文字」を「バイト」に変更します
- プログラムは、理論的に予想される頻度で文字列をランダムに出力する必要があります
これはcode-golfなので、最短のプログラムが勝ちです!
^
と$
が引用符で囲まれているのはなぜですか?引用符から取り除いたり、逆引用符で囲んだりすることがより明確になる場合があります。