이 질문에는 간단한 Markov 모델이 사용됩니다. Markov Chains에 대한 자세한 내용은 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
,을 얻기의 기회의 2/3이 o
과를 얻기의 1 분의 기회 a
.
'c' -> {'o', 'o', 'a'}
도전
입력을받지 않고 위와 같이 Markov Chain을 사용하여 생성 된 임의의 문자열을 출력하는 프로그램을 작성하십시오. 여기서 체인의 입력은 프로그램의 소스입니다.
- 프로그램에는 최소한 두 개의 문자가 있어야하며 두 문자는 동일해야합니다 (한 개의 출력 만있는 "보링"체인을 방지하려면)
- 원하는 경우 문자 대신 바이트를 사용하도록 모델을 수정할 수 있지만 규칙 1에서 "문자"를 "바이트"로 변경하십시오.
- 프로그램은 이론적으로 예상되는 빈도로 문자열을 무작위로 출력해야합니다.
이것은 code-golf 이므로 가장 짧은 프로그램이 승리합니다!
^
과 $
의 따옴표는? 따옴표에서 빼거나 인용 부호로 묶는 것이 더 명확해질 수 있습니다.