자귀
웜은 음이 아닌 정수의 목록이며, 그 오른쪽 (즉, 마지막 ) 요소는라고 머리 . 헤드가 0이 아닌 경우, 웜은 헤드를 포함하고 적어도 헤드만큼 큰 모든 요소를 갖는 가장 긴 연속 요소 블록 으로 구성된 활성 세그먼트를 갖습니다 . 환원 활성 부분은 예를 들면 1만큼 감소 헤드와 유효 구간이며, 웜이 3 1 2 3 2
활성 부분을 가지고 2 3 2
, 환원 활성 부분이다 2 3 1
.
진화의 규칙
웜은 다음과 같이 단계별로 발전합니다.
단계 t (= 1, 2, 3, ...)에서
, 헤드가 0 인 경우 : 헤드를 삭제하고
그렇지 않으면 : 활성 세그먼트를 축소 된 활성 세그먼트의 t + 1 연결된 사본으로 대체하십시오.
사실 : 모든 웜은 결국 빈 목록으로 진화하며, 그렇게하는 단계의 수는 웜의 수명 입니다.
(자세한 내용은 LD Beklemishev의 논문 인 The Worm Principle 에서 찾을 수 있습니다 . 유한 순서를 의미하는 "list"와 마지막 요소 를 의미하는 "head"의 사용법은 이 논문에서 가져 왔습니다. 혼동해서는 안됩니다. 공통 사용과 추상 데이터 유형리스트 , 헤드가 일반적 수단 첫번째 요소).
예 (괄호 안의 활성 세그먼트)
웜 : 0,1
step worm
0(1)
1 0 0 0
2 0 0
3 0
4 <- lifetime = 4
웜 : 1,0
step worm
1 0
1 (1)
2 0 0 0
3 0 0
4 0
5 <- lifetime = 5
웜 : 1,1
step worm
(1 1)
1 1 0 1 0
2 1 0(1)
3 1 0 0 0 0 0
4 1 0 0 0 0
5 1 0 0 0
...
8 (1)
9 0 0 0 0 0 0 0 0 0 0
10 0 0 0 0 0 0 0 0 0
...
18 0
19 <- lifetime = 19
웜 : 2
step worm
(2)
1 (1 1)
2 1 0 1 0 1 0
3 1 0 1 0(1)
4 1 0 1 0 0 0 0 0 0
5 1 0 1 0 0 0 0 0
6 1 0 1 0 0 0 0
...
10 1 0(1)
11 1 0 0 0 0 0 0 0 0 0 0 0 0 0
12 1 0 0 0 0 0 0 0 0 0 0 0 0
...
24 (1)
25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
...
50 0
51 <- lifetime = 51
웜 : 2,1
(2 1)
1 2 0 2 0
2 2 0(2)
3 2 0(1 1 1 1)
4 2 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0
5 2 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0(1 1 1)
6 2 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0
7 2 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0(1 1)
8 2 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0{1 0}^9
...
?? <- lifetime = ??
웜 : 3
step worm
(3)
1 (2 2)
2 (2 1 2 1 2 1)
3 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0
4 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1(2)
5 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0(2 1 2 1 1 1 1 1 1 1)
6 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0{2 1 2 1 1 1 1 1 1 0}^7
7 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0{2 1 2 1 1 1 1 1 1 0}^6 (2 1 2 1 1 1 1 1 1)
... ...
?? <- lifetime = ??
곁에
표준의 관점에서 다음과 하한 같이 웜 수명은 일반적으로 거대하다 빠르게 성장하고있는 계층 구조 F 기능의 α :
worm lower bound on lifetime
---------------- ------------------------------------------
11..10 (k 1s) f_k(2)
2 f_ω(2)
211..1 (k 1s) f_(ω+k)(2)
2121..212 (k 2s) f_(ωk)(2)
22..2 (k 2s) f_(ω^k)(2)
3 f_(ω^ω)(2)
...
n f_(ω^ω^..^ω)(2) (n-1 ωs) > f_(ε_0) (n-1)
놀랍게도, 웜 [3]은 이미 그레이엄의 수인 G 를 훨씬 능가하는 수명을 가지고 있습니다 .
f ω ω (2) = f ω 2 (2) = f ω2 (2) = f ω + 2 (2) = f ω + 1 (f ω + 1 (2)) >> f ω + 1 (64) > G.
코드 골프 챌린지
다음과 같은 동작으로 가장 짧은 기능 서브 프로그램을 작성하십시오.
입력 : 모든 웜.
출력 : 웜의 수명.코드 크기는 바이트 단위로 측정됩니다.
다음은 예입니다 (Python, 골프는 약 167 바이트).
from itertools import *
def T(w):
w=w[::-1]
t=0
while w:
t+=1
if w[0]:a=list(takewhile(lambda e:e>=w[0],w));a[0]-=1;w=a*(t+1)+w[len(a):]
else:w=w[1:]
return t
NB : t (n)이 웜 [n]의 수명 인 경우, t (n)의 성장률은 대략 Goodstein 함수 의 성장률입니다 . 따라서 이것이 100 바이트 이하로 골프를 칠 수 있다면 최대 인쇄 가능 질문에 대한 답을 얻을 수 있습니다 . (해답을 위해 스텝 카운터를 항상 0에서 시작하는 대신 웜 [n]과 동일한 값인 n에서 시작하여 성장 속도를 크게 가속화 할 수 있습니다.)
2 1
적절한 시간에 질문하는 너무 많은 수 있습니다,하지만 유용한 테스트는 순서가 시작해야 함을 (2 1)
, 2 0 2 0
, 2 0 (2)
, 2 0 (1 1 1 1)
, ...
w[0]
를 그 목록의 가장 왼쪽 요소 인 것으로 취급합니까?