Một mô hình Markov đơn giản sẽ được sử dụng trong câu hỏi này. Để biết thêm thông tin về Chuỗi Markov, xem http://setosa.io/ev/markov-chains/ .
Lấy một chuỗi. Trong ví dụ này, chúng tôi sẽ sử dụng từ:
reader
Bây giờ, đối với mỗi ký tự, lấy các ký tự xuất hiện sau mỗi lần xuất hiện của ký tự trong chuỗi. ( `^`
đại diện cho sự bắt đầu của chuỗi và `$`
đại diện cho sự kết thúc)
`^` -> {'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'}
Bây giờ, bắt đầu từ đầu chuỗi, chọn ngẫu nhiên từ một trong các ký tự trong bộ tiếp theo. Nối ký tự này và sau đó chọn từ các ký tự trong tập tiếp theo của nó, và cứ thế cho đến khi bạn đi đến cuối. Dưới đây là một số từ ví dụ:
r
rereader
rer
readereader
Nếu một nhân vật xuất hiện sau một nhân vật khác nhiều lần, nhiều khả năng nó sẽ được chọn. Ví dụ, trong cocoa can
, sau một c
, có hai phần ba cơ hội nhận được một o
và một phần ba cơ hội nhận được một a
.
'c' -> {'o', 'o', 'a'}
Thử thách
Tạo một chương trình không có đầu vào và đầu ra một chuỗi ngẫu nhiên được tạo bằng Chuỗi Markov, như ở trên, trong đó đầu vào của chuỗi là nguồn của chương trình.
- Chương trình phải có ít nhất hai ký tự, hai trong số đó phải giống nhau (Để tránh các chuỗi "nhàm chán" chỉ có một đầu ra)
- Bạn có thể sửa đổi mô hình để sử dụng byte thay vì ký tự nếu muốn, nhưng thay đổi "ký tự" thành "byte" trong quy tắc 1
- Chương trình sẽ xuất ra các chuỗi ngẫu nhiên với tần suất dự kiến trong lý thuyết
Đây là môn đánh gôn , vì vậy chương trình ngắn nhất sẽ thắng!
^
và $
trong dấu ngoặc kép? nó có thể làm cho nó rõ ràng hơn để đưa nó ra khỏi dấu ngoặc kép, hoặc đặt chúng trong backquote.