查找 Champernowne 常数中第一次出现的一串数字的数字位置

问题描述 投票:0回答:1

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

example below is of the dec-encoding of Genesis 1:1:

进一步阅读这个令人着迷的常数:

https://www.kanonical.io/an_interesting_property_of_champernownes_number/

https://mathworld.wolfram.com/ChaampernowneConstant.html

https://youtu.be/BLcneg8ynIM?t=10m45s

Chambernowne 常数是无限长、无理、超越、正常且构造的。

我尝试了附带的 python 脚本。

python math numbers constants
1个回答
0
投票

一个数字的索引唯一可能早于预期的情况是它本身就是一个(截断的)Chambernowne 序列:

12
的位置与
1
的位置相同;
5678910
的位置与
5
的位置相同,
10011002100310
的位置与
1001
相同,等等

因此,高效的算法将首先检查输入本身是否是 Champernowne 序列,如果是,则只需查找序列中第一项的索引。如果不是,那么它就不是子序列,它的索引将是“它自己的索引”。

© www.soinside.com 2019 - 2024. All rights reserved.