Chambernowne 常数为 0.123456789101112131415...
计算一串数字的第一次出现的方法(例如,字符串“12”首先出现在索引 1 处,而不是“12”,尽管它也在那里)比下面用 python 编写的方法更有效的方法是什么?简而言之,您可以连接一个循环变量并对结果字符串进行索引搜索。但这仅适用于 10**7 以下的数字。下面的脚本可以在几分钟内处理 200 位数字。
这是一个比数据压缩更有趣的问题。
import random
while True:
x=ax=random.randint(1,10**100) #CHANGE INPUT HERE
#x=ax=int()
input()
print('x',x)
checklist=[]
if int(str(ax)[0])==9:
d=0
while int(str(ax)[d])==9:
ax=int(str(ax)+'0')
d=d+1
wx=int(str(ax)+str(ax))
parsed=[]
for i in range(1,len(str(ax))+1):
for j in range(len(str(ax))):
wxtwo=int(str(wx)[j:j+i])
parsed.append(wxtwo)
for i in range(len(parsed)):
wparsed=parsed[i]
guess=wparsed-1
wparsed=int(str(guess)+str(wparsed))
j=1
while len(str(wparsed))<len(str(wx)):
wparsed=int(str(wparsed)+str(parsed[i]+j))
j=j+1
if guess==0: guess=1
check=str(wparsed).count(str(x))
if check>0:
if str(wparsed).index(str(x))<len(str(guess)):
if guess>0:
checklist.append(guess)
wparsed=parsed[i]
guess=wparsed-0
wparsed=int(str(wparsed))
j=1
while len(str(wparsed))<len(str(wx)):
wparsed=int(str(wparsed)+str(parsed[i]+j))
j=j+1
if guess==0: guess=1
check=str(wparsed).count(str(x))
if check>0:
if str(wparsed).index(str(x))<len(str(guess)):
checklist.append(guess)
wx=int(str(x)+str(x))
parsed=[]
for i in range(1,len(str(x))+1):
for j in range(len(str(x))):
wxtwo=int(str(wx)[j:j+i])
parsed.append(wxtwo)
for i in range(len(parsed)):
wparsed=parsed[i]
guess=wparsed-1
wparsed=int(str(guess)+str(wparsed))
j=1
while len(str(wparsed))<len(str(wx)):
wparsed=int(str(wparsed)+str(parsed[i]+j))
j=j+1
if guess==0: guess=1
check=str(wparsed).count(str(x))
if check>0:
if str(wparsed).index(str(x))<len(str(guess)):
if guess>0:
checklist.append(guess)
wparsed=parsed[i]
guess=wparsed-0
wparsed=int(str(wparsed))
j=1
while len(str(wparsed))<len(str(wx)):
wparsed=int(str(wparsed)+str(parsed[i]+j))
j=j+1
if guess==0: guess=1
check=str(wparsed).count(str(x))
if check>0:
if str(wparsed).index(str(x))<len(str(guess)):
checklist.append(guess)
guess=min(checklist)
dguess=str(guess)+str(guess)
for i in range(len(str(guess))):
wguess=dguess[i:i+len(str(guess))]
wdguess=wguess+str(int(wguess)+1)
if wdguess.count(str(x))==1:
checklist.append(int(wguess))
guess=min(checklist)
print('n',guess)
q=n=guess
d=0
i=p=0
while n>0:
d=10**(len(str(n))-1)-1
m=n
n=n-d
p=p+n*len(str(m))
n=d
p=1+p-len(str(q))
guesstwo=str(guess)+str(guess+1)
p=p+guesstwo.index(str(x))
print('d',p)
#Jesus is Lord
进一步阅读这个令人着迷的常数:
https://www.kanonical.io/an_interesting_property_of_champernownes_number/
https://mathworld.wolfram.com/ChaampernowneConstant.html
https://youtu.be/BLcneg8ynIM?t=10m45s
Chambernowne 常数是无限长、无理、超越、正常且构造的。
我尝试了附带的 python 脚本。
一个数字的索引唯一可能早于预期的情况是它本身就是一个(截断的)Chambernowne 序列:
12
的位置与 1
的位置相同; 5678910
的位置与 5
的位置相同,10011002100310
的位置与 1001
相同,等等
因此,高效的算法将首先检查输入本身是否是 Champernowne 序列,如果是,则只需查找序列中第一项的索引。如果不是,那么它就不是子序列,它的索引将是“它自己的索引”。