条款
一个蠕虫是负整数的任何名单,以及其最右边(即最后一个)元素称为头。如果头部不为0,则蠕虫的活动段由最长的连续元素块组成,该元素块包括头部,并且其所有元素至少与头部一样大。在简约有效段是主动段与由1。例如递减的头,所述蜗杆3 1 2 3 2
具有活性片段2 3 2
,以及减少的活性段2 3 1
。
进化规则
蠕虫逐步演化如下:
在步骤t(= 1,2,3,...)中,
如果头为0:删除头,
否则:用缩减的活动段的t + 1级联副本替换活动段。
事实:任何蠕虫最终都会演变成空列表,而这样做的步骤就是蠕虫的生存期。
(有关详细信息,请参阅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]的寿命已经远远超过了格雷厄姆数 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
注意:如果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]
那个列表的*最左边的元素?