条項
ワームは、非負の整数のいずれかのリストであり、その右端の(すなわち、最後の)要素が呼ばれているヘッド。headが0でない場合、ワームは、headを含む要素の最も長い連続したブロックで構成されるアクティブなセグメントを持ち、すべての要素は少なくともheadと同じ大きさです。減少活性セグメントはたとえば1だけデクリメントヘッドとアクティブなセグメントであり、ワームが3 1 2 3 2
アクティブなセグメントを有し2 3 2
、縮小アクティブセグメントです2 3 1
。
進化のルール
ワームは、次のように段階的に進化します。
ステップt(= 1、2、3、...)で
、ヘッドが0の場合:ヘッドを削除する
else:アクティブセグメントを、縮小されたアクティブセグメントのt + 1連結コピーで置き換える。
事実:ワームは最終的に空のリストに進化し、そのためのステップ数はワームの存続期間です。
(詳細はThe Worm Principle、LD Beklemishevの論文に記載されています。有限リストを意味する「リスト」、およびその最後の要素を意味する「頭」の使用法は、この論文から引用されています。リストの一般的な使用法は抽象データ型であり、通常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]にはすでにGrahamの数 G をはるかに超える寿命があります。
F ω ω(2)= F ω 2(2)= F ω2(2)= F ω+ 2(2)= F ω+ 1(F ω+ 1 F(2))>> ω+ 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
注意:t(n)がワームの寿命[n]である場合、t(n)の成長率はおおよそGoodstein関数の成長率です。そのため、これを100バイト未満にゴルフできる場合、印刷可能な最大数の質問に勝利の答えを与えることができます。(その答えとして、ステップカウンターを常に0から開始するのではなく、ワーム[n]と同じ値から開始することにより、成長率を大幅に加速することができます。)
2 1
合理的な時間内に尋ねることが多すぎるかもしれないが、有用な試験シーケンスを開始すべきであるということです(2 1)
、2 0 2 0
、2 0 (2)
、2 0 (1 1 1 1)
、...
w[0]
をそのリストの*左端の要素として扱いますか?