คำถามมาร์คอฟแบบง่ายจะใช้ในคำถามนี้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโซ่มาร์คอฟดู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'}
ตอนนี้เริ่มจากจุดเริ่มต้นของสตริงเลือกสุ่มจากหนึ่งในตัวละครในชุดถัดไป ผนวกอักขระนี้แล้วเลือกจากตัวละครในชุดถัดไปและต่อไปเรื่อย ๆ จนกว่าคุณจะไปจนจบ นี่คือตัวอย่างคำ:
r
rereader
rer
readereader
หากตัวละครปรากฏขึ้นหลังจากตัวละครอื่นหลายครั้งก็มีแนวโน้มที่จะเลือก ยกตัวอย่างเช่นในcocoa can
หลังจากที่c
มีสองในสามของโอกาสในการได้รับการอื่นo
และมีโอกาส 1/3 a
ของรับ
'c' -> {'o', 'o', 'a'}
ท้าทาย
สร้างโปรแกรมที่ไม่มีอินพุตและเอาต์พุตสตริงแบบสุ่มที่สร้างโดยใช้ Markov Chain เช่นด้านบนซึ่งอินพุตไปยัง chain เป็นซอร์สของโปรแกรม
- โปรแกรมต้องมีอักขระอย่างน้อยสองตัวซึ่งสองตัวต้องเหมือนกัน (เพื่อป้องกันโซ่ "น่าเบื่อ" ที่มีเพียงหนึ่งเอาต์พุต)
- คุณสามารถปรับเปลี่ยนรูปแบบเพื่อใช้ไบต์แทนอักขระได้หากต้องการ แต่เปลี่ยน "อักขระ" เป็น "ไบต์" ในกฎ 1
- โปรแกรมควรส่งออกสตริงแบบสุ่มกับความถี่ที่คาดหวังในทางทฤษฎี
นี่คือรหัสกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดชนะ!
^
และ$
ในเครื่องหมายคำพูด? มันอาจทำให้ชัดเจนมากขึ้นที่จะนำออกจากคำพูดหรือใส่ไว้ใน backquotes