Điều kiện
Một con sâu là bất kỳ danh sách các số nguyên không âm, và nó ngoài cùng bên phải (tức là, cuối cùng phần tử) được gọi là người đứng đầu . Nếu đầu không bằng 0, sâu có một phân đoạn hoạt động bao gồm khối các phần tử tiếp giáp dài nhất bao gồm đầu và có tất cả các phần tử của nó ít nhất bằng đầu . Các giảm phân khúc hoạt động là phân khúc hoạt động với người đứng đầu giảm đi 1. Ví dụ, con sâu 3 1 2 3 2
có phân khúc hoạt động 2 3 2
, và phân khúc hoạt động giảm là 2 3 1
.
Quy luật tiến hóa
Một con sâu tiến hóa từng bước như sau:
Trong bước t (= 1, 2, 3, ...),
nếu đầu là 0: xóa đầu
khác: thay thế phân đoạn hoạt động bằng các bản sao được ghép nối t + 1 của phân đoạn hoạt động giảm.
Sự thật : Bất kỳ con sâu nào cuối cùng cũng tiến hóa vào danh sách trống và số bước cần thực hiện là thời gian tồn tại của con sâu .
(Chi tiết có thể được tìm thấy trong Nguyên lý sâu , một bài báo của LD Beklemishev. Việc sử dụng "danh sách" có nghĩa là một chuỗi hữu hạn và "đầu" để chỉ phần tử cuối cùng của nó , được lấy từ bài báo này - không nên nhầm lẫn với cách sử dụng phổ biến cho các danh sách dưới dạng kiểu dữ liệu trừu tượng , trong đó phần đầu thường có nghĩa là phần tử đầu tiên .)
Ví dụ (phân đoạn hoạt động trong ngoặc đơn)
Giun: 0,1
step worm
0(1)
1 0 0 0
2 0 0
3 0
4 <- lifetime = 4
Giun: 1,0
step worm
1 0
1 (1)
2 0 0 0
3 0 0
4 0
5 <- lifetime = 5
Giun: 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
Giun: 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
Giun: 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 = ??
Giun: 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 = ??
Qua một bên
Tuổi thọ của giun thường rất lớn, như được thể hiện bởi các giới hạn dưới đây về mặt phân cấp phát triển nhanh tiêu chuẩn của các hàm 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)
Đáng chú ý, sâu [3] đã có một cuộc đời vượt xa số lượng của Graham , G:
f ω ω (2) = f ω 2 (2) = f ω2 (2) = f ω + 2 (2) = f ω + 1 (f ω + 1 (2)) >> f ω + 1 (64) > G
Code Golf Challenge
Viết chương trình con hàm ngắn nhất có thể với hành vi sau:
Đầu vào : Bất kỳ sâu.
Đầu ra : Tuổi thọ của sâu.Kích thước mã được đo bằng byte.
Đây là một ví dụ (Python, golf đến khoảng 167 byte):
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
Lưu ý : Nếu t (n) là thời gian tồn tại của sâu [n], thì tốc độ tăng trưởng của t (n) gần bằng với hàm Goodstein . Vì vậy, nếu điều này có thể được đánh gôn dưới 100 byte, nó cũng có thể đưa ra câu trả lời chiến thắng cho câu hỏi Số lượng lớn nhất có thể in được . (Đối với câu trả lời đó, tốc độ tăng trưởng có thể được tăng tốc đáng kể bằng cách luôn bắt đầu bộ đếm bước ở n - cùng giá trị với con sâu [n] - thay vì bắt đầu từ 0.)
2 1
có thể là quá nhiều để yêu cầu trong một thời gian hợp lý, nhưng xét nghiệm hữu ích là chuỗi nên bắt đầu (2 1)
, 2 0 2 0
, 2 0 (2)
, 2 0 (1 1 1 1)
, ...
w[0]
phần tử * ngoài cùng bên trái của danh sách đó?