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 o
ve üç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.