2.124 * 10 ^ 519にCCCCCCが見つかりました。
正確な指標である2124002227156710537549582070283786072301315855169987260450819829164756027922998360364044010386660076550764749849261595395734745608255162468143483136030403857241667604197146133343367628903022619551535534430377929831860918493875279894519909944379122620704864579366098015086419629439009415947634870592393974557860358412680068086381231577773140182376767811142988329838752964017382641454691037714240414750501535213021638601291385412206075763857490254382670426605045419312312880204888045665938646319068208885093114686859061215
3.5時間の検索後、以下のコード(の旧バージョン)を使用してresによって検出されました。
そのインデックスの周りの文字列は次のとおりです。 ...BCCBCBCCCBCCCCCCBCCB...
確認するには、以下のコードの指示された行を5ではなく2946から開始するように変更します。確認には20秒かかります。
更新:プログラムの改善。古いプログラムは、必要な場所の10倍以上の場所を検索しました。
新しいバージョンはCCCCCC
わずか33分で見つかります。
コードのしくみ:基本的に、インクリメンタル文字列の末尾に対応する領域のみを見て、元の文字列を再帰的に振り返って文字を計算します。メモ表を使用しているため、メモリがいっぱいになる可能性があります。必要に応じて、メモテーブルの長さにキャップを付けます。
import time
import sys
sys.setrecursionlimit(4000)
ULIMIT=4000
end_positions=[]
current_end=2
while len(end_positions)<ULIMIT+3:
end_positions.append(current_end)
next_end=((current_end+1)*3+1)//2-1
current_end=next_end
memo={}
def find_letter(pos):
if pos in memo:
return memo[pos]
if pos<3:
return 'ABC'[pos]
for end_num in range(len(end_positions)-1):
if pos>end_positions[end_num] and pos<=end_positions[end_num+1]:
delta=end_positions[end_num+1]-end_positions[end_num]
if len(memo)>5*10**6:
return find_letter(pos-delta)
memo[pos]=find_letter(pos-delta)
return memo[pos]
time.clock()
for end_num in range(5,ULIMIT+1): # This line.
diff = 1 # Because end_num is guaranteed to be a C
while True:
last_letter=find_letter(end_positions[end_num]+diff)
if not last_letter=='C':
break
diff+=1
if end_num%100==0:
pos_str=str(end_positions[end_num])
print(end_num,'%s.%s*10^%i'%(pos_str[0],pos_str[1:5],len(pos_str)-1),
len(memo),diff,time.clock())
if diff>=6:
print(end_num,end_positions[end_num],diff,time.clock())
現在の最大検索数:4000回
CCCCCC
反復で見つかった:2946
CCCCC
インデックス27308で見つけたと言っていますが、後でそれがどこで最初に発生するかわからないようです。という意味CCCCCC
ですか?