나는 셀룰러 오토 마톤으로 놀고 있었고 흥미로운 행동을하는 것을 발견했습니다. 작동 방식은 다음과 같습니다.
왼쪽에서 오른쪽으로 이진 문자열을 읽습니다. 1
뒤에 2
다른 값이 있으면 0
결과에 a 를 추가 하고 계속 읽습니다. 값이 발견되면 0
(또는 3 개 미만의 값이 남음) 현재 값을 추가하고 a 1
를 계속 읽습니다. 문자열의 끝에는 1
결과에 단일이 추가됩니다 .
다음은 한 세대의 예제입니다.
01011111
^
먼저 결과를 0
추가 01
하여 결과에 추가 합니다.
01011111
^
01
이제 우리 1
는 0 을 만나고 다음 두 값을 건너 뜁니다.
01011111
^
010
우리는 다른 1
것을 만나서 똑같이합니다
01011111
^
0100
우리는 이제 또 다른 1
공간이 충분하지 않아서 현재 셀과 1
(이 경우 11
)를 추가합니다
01011111
^
010011
우리는 마지막에 있으므로 싱글을 추가 1
하고이 세대를 종료합니다
01011111
^
0100111
직무
합리적인 형식으로 입력하면 자동 생성의 1 세대를 계산하는 함수 또는 프로그램을 작성해야합니다.
이것은 코드 골프 질문이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.
샘플 구현
다음은 Haskell의 샘플 구현입니다 (함수를 정의 d
하지만 프로그램은 반복적으로 무기한을 인쇄합니다).
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10
그것을 인쇄해야 11011
합니까? 몇 가지 테스트 사례가 더 도움이 될 것이라고 생각합니다