나는 셀룰러 오토 마톤으로 놀고 있었고 흥미로운 행동을하는 것을 발견했습니다. 작동 방식은 다음과 같습니다.
왼쪽에서 오른쪽으로 이진 문자열을 읽습니다. 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합니까? 몇 가지 테스트 사례가 더 도움이 될 것이라고 생각합니다