ข้อตกลงและเงื่อนไข
หนอนคือรายการของจำนวนเต็มไม่เป็นลบใด ๆ และขวาสุด (เช่นที่ผ่านมา ) องค์ประกอบที่เรียกว่าหัว ถ้าหัวไม่ได้เป็น 0, หนอนมีส่วนที่ใช้งานซึ่งประกอบด้วยบล็อกที่ต่อเนื่องกันยาวที่สุดขององค์ประกอบที่มีหัวและมีทุกองค์ประกอบอย่างน้อยมีขนาดใหญ่เท่าหัว ส่วนที่ใช้งานลดลงเป็นส่วนที่ใช้งานกับหัว decremented โดย 1 ตัวอย่างเช่นหนอน3 1 2 3 2
มีส่วนที่ใช้งานและในส่วนของการใช้งานลดลงคือ2 3 2
2 3 1
กฎของวิวัฒนาการ
หนอนวิวัฒนาการทีละขั้นตอนดังนี้:
ในขั้นตอน t (= 1, 2, 3, ... )
หากส่วนหัวเป็น 0: ลบส่วนหัว
อื่น: แทนที่ส่วนที่ใช้งานอยู่ด้วย t + 1 ที่ต่อกันกับสำเนาของส่วนที่ทำงานลดลง
ความเป็นจริง : หนอนใด ๆ ในที่สุดก็วิวัฒนาการเป็นรายการที่ว่างเปล่าและจำนวนของขั้นตอนในการทำเช่นนั้นเป็นหนอนของอายุการใช้งาน
(รายละเอียดสามารถพบได้ในหลักการหนอนกระดาษโดย LD Beklemishev การใช้ "รายการ" เพื่อหมายถึงลำดับที่แน่นอนและ "หัว" เพื่อหมายถึงองค์ประกอบสุดท้ายของมันถูกนำมาจากบทความนี้ - มันไม่ควรสับสน กับการใช้งานทั่วไปสำหรับรายการเป็นชนิดข้อมูลนามธรรมที่หัวมักจะหมายถึงแรกองค์ประกอบ.)
ตัวอย่าง (ส่วนที่ใช้งานอยู่ในวงเล็บ)
หนอน: 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:
ฉω ω (2) = f ω 2 (2) = f ω2 (2) = f ω + 2 (2) = f ω + 1 (ฉω + 1 (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 ไบท์มันอาจให้คำตอบที่ดีที่สุดสำหรับคำถามที่พิมพ์ได้จำนวนมากที่สุด (สำหรับคำตอบนั้นอัตราการเติบโตนั้นสามารถเร่งได้อย่างมหาศาลโดยเริ่มต้นขั้นตอนที่เคาน์เตอร์ที่ n - ค่าเดียวกับเวิร์ม [n] - แทนที่จะเริ่มต้นที่ 0)
2 1
อาจจะมากเกินไปที่จะขอในเวลาที่เหมาะสม แต่การทดสอบที่เป็นประโยชน์ว่าลำดับควรเริ่มต้น(2 1)
, 2 0 2 0
, 2 0 (2)
, 2 0 (1 1 1 1)
...
w[0]
ซึ่งเป็นองค์ประกอบ * ซ้ายสุดของรายการที่?