Bu soruda basit bir Markov Modeli kullanılacaktır. Markov Zincirleri hakkında daha fazla bilgi için bkz. Http://setosa.io/ev/markov-chains/ .
Bir ip alın. Bu örnek için şu sözcüğü kullanacağız:
reader
Şimdi, her karakter için, karakter dizisindeki her oluşumdan sonra görünen karakterleri alın. ( `^`dizenin başlangıcını ve `$`sonunu temsil eder)
`^` -> {'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'}
Şimdi, dizenin başından başlayarak, sonraki setteki karakterlerden birinden rastgele seçin. Bu karakteri ekleyin ve bir sonraki kümesindeki karakterlerden seçim yapın ve sonuna kadar devam edin. İşte bazı örnek kelimeler:
r
rereader
rer
readereader
Bir karakter başka bir karakterin ardında birden çok kez görünüyorsa, seçilme olasılığı daha yüksektir. Örneğin cocoa can, a'dan sonra c, bir ove üçte bir elde etme şansının üçte ikisi vardır a.
'c' -> {'o', 'o', 'a'}
Meydan okuma
Hiçbir girdi almayan ve yukarıdaki gibi Markov Zinciri kullanılarak oluşturulan rastgele bir dize çıkaran bir program oluşturun, burada zincire girdi programın kaynağıdır.
- Program en az iki karakterden oluşmalıdır, ikisi aynı olmalıdır (Yalnızca bir çıktısı olan "sıkıcı" zincirleri önlemek için)
- İsterseniz modeli karakter yerine bayt kullanacak şekilde değiştirebilirsiniz, ancak kural 1'de "karakter" i "bayt" olarak değiştirebilirsiniz
- Program, teoride beklenen sıklıkta rastgele dizeler çıkarmalıdır
Bu kod golf , bu yüzden en kısa program kazanır!
^ve $tırnak işaretleri? alıntılardan çıkarılmasını veya geri tırnak içine koymayı daha açık hale getirebilir.