この無限の文字列の実行はどこにありますか?(CCCCCCが見つかりました!)


25

文字列から始めて、ABC最後の半分を繰り返し自分自身に追加した結果を考慮します(長さが奇数の場合は大きい半分を使用します)。

進行状況を取得します。

ABC
ABCBC
ABCBCCBC
ABCBCCBCCCBC
ABCBCCBCCCBCBCCCBC
etc...

Sこの手順が永遠に繰り返される結果として生じる無限の文字列(またはシーケンス)を表現しましょう。

ゴール

このコードの挑戦目標は、の実行が最初に出現する位置のインデックスを見つけることですCでs」をS

最初は簡単です:C最初のインデックスで発生した2CC4CCC7CCCC26はなく、CCCCCインデックスにすべての方法です27308!その後、私の記憶がなくなります。

勝者は、ほとんどの実行インデックスを(順に、順番にC)正しく生成する提出物になります。あらゆる種類のアルゴリズムを使用できますが、基本的なブルートフォースを使用していない場合は、必ず説明してください。入力と出力は、理解しやすい任意の形式にすることができます。

重要な注意:のSすべての実行が実際に含まれているかどうかは公式にはわかりませんC。この質問は、作者も見つけられなかった数学スタック交換に関するこの質問から派生していCCCCCCます。ここの誰かができるかどうか興味があります。(その質問は、トピックに関する私の元の質問に基づいています。)

すべての実行がC発生するわけではないことを証明できる場合S、この質問は無効になるため、自動的に勝ちます。誰もCCCCCCそれを証明も発見もできない場合、勝者はインデックスの最高下限CCCCCC(または未解決の最大のランCCCCCCが見つかった場合)を得ることができる人になります。

更新:天文インデックス2.124 * 10 ^ 519で見つかったisaacgresへの名誉ある賞賛CCCCCC。このレートCCCCCCCでは、ブルートフォースに依存する方法で見つけることは想像できません。お疲れ様でした!


わかりません-あなたはCCCCCインデックス27308で見つけたと言っていますが、後でそれがどこで最初に発生するかわからないようです。という意味CCCCCCですか?
isaacg 14

@isaacgおっと。6 Cは見つけるのが難しいものです。それを修正します。
カルビンの趣味14

推測が間違っている場合、c ^ Nが最長実行であるNがあります。長いシーケンスを構築して矛盾を導き、推測を証明することが可能であるはずです。また、私はそれがあまりにも難しいとは思いませんが、他の手の問題について簡単に過小評価することができます...
インゴ・バーク

質問と回答の両方について、私は間違いなく新しい投票票で真夜中にここに戻ってきます!
センモウヒラムシ

検索している人にとって、これは少し簡単にすることができます。最初の「A」を削除した場合、「AB」で遊ぶだけで、次の反復のためにhalf + 1を追加できます。
Faquarl 14

回答:


23

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


これはPythonですよね?
カルビンの趣味14

ええ、私はそれを追加します。
isaacg 14

(+1)sys.setrecursionlimit(4000)andを使用した プログラムは、ULIMIT=4000(私のシステムでは約3.5時間以内に)インデックス= 2.124 * 10 ^ 519で最初のCCCCCCを検出しました。正確なインデックスが...次のコメントである
resは

3
2124002227156710537549582070283786072301315855169987260450819829164756027922998360364044010386660076550764749849261595395734745608255162468143483136030403857241667604197146133343367628903022619551535534430377929831860918493875279894519909944379122620704864579366098015086419629439009415947634870592393974557860358412680068086381231577773140182376767811142988329838752964017382641454691037714240414750501535213021638601291385412206075763857490254382670426605045419312312880204888045665938646319068208885093114686859061215
resは

驚くばかり!成功に近いとは思わなかった。
isaacg 14

12

2.124 * 10 ^ 519にCCCCCCが見つかりました。

次のルビーコードを使用してを検索しましたCCCCCC

SEARCH = 6

k = [5,3]

getc=->i{
  j=i
  k.unshift(k[0]+(k[0]+1)/2)while(k[0]<=j)
  k.each_cons(2){|f,g|j-=f-g if j>=g}
  "ABC"[j]
}

while true
  x=k[0]
  x-=1 while getc[x]=="C"
  x+=1 
  l=1
  l+=1 while getc[x+l]=="C"

  break if l>=SEARCH
end

puts x
puts (x-14..x+l+13).map{|i|getc[i]}*""

インデックスは@isaacgの回答と同じです。

上記のコードの6の実行時間は、コンピューター上で10秒程度です。それでも、それはまだ答えを探していますCCCCCCC(自分で試してみたい場合は、定数SEARCHをに設定します7)。

インデックスの周りの文字列が印刷される最後の行で行われるようにgetc、特定の位置で文字を見つけるために使用できますi


それをスピードアップする良い仕事-私の解決策は非常に荒く、洗練されていませんでした。
isaacg 14

奇妙なこと:ブレークを削除し、テストを少し変更した後、上記のコードを繰り返し#34000まで実行しましたが、6回の実行のみが見つかりました。これはコードの問題ですか(疑わしい)またはそれは単にシーケンスの奇妙な特性ですか?
isaacg

@isaacg各シーケンスのブレークのみをチェックするため、すべてのコピーシーケンスC ^ 6が欠落していることに注意してください。休憩時にはそれらは非常にまれであるようです-したがって、私たちはすぐにC ^ 7を見ることがないと思います。
ハワード14

私は知っていますが、2946回の反復後のシーケンスブレークで1つが見つかったので、40000回の反復で2つ目が表示されると予想されます。
isaacg 14

@isaacgあなたはここに(はるかに速い)コードを使用することができます:ideone.com/HoEKOBを。それにもかかわらず、シーケンスポイントで別のC ^ 6を見つけることができませんでした(さらにC ^ 7でした)。
ハワード14

5

(答えではありませんが、コメントするには長すぎます。)

以下は、@ HowardのRubyプログラムの Python変換です(getc検索ループに1つだけを含めることで、3倍近くにスピードアップします)。私のシステムでは、これは3秒で最初のC ^ 6を見つけます。93時間で、231,000回の反復でC ^ 7が見つからないため、最初のC ^ 7(存在する場合)は、無限文字列の左端の10 ^ 40677の位置の後に発生する必要があります。

import time

L = [5, 3]      #list grows "backwards" (by insertion on the left)

def getc(i):    #return the letter at index i
    while L[0] <= i: L.insert(0,L[0] + (L[0] + 1)//2)
    for k in range(len(L)-1): 
        if i >= L[k+1]: i -= L[k] - L[k+1]
    return 'abc'[i]

def search(k):  #find the first occurrence of c^k
    start = time.time()
    iter = 0
    while True:
        iter += 1
        if iter % 1000 == 0: print iter, time.time()-start
        p = L[0] - 1
        l = 1
        while getc(p+l)=='c': l += 1
        if l == k: break 
    return p, iter, time.time()-start

k = 6

(indx, iter, extime) = search(k)
print 'run length:', k
print 'index:', indx, '    (',len(str(indx)),'digits )'
print 'iteration count:', iter
print 'neighborhood:', ''.join([getc(i) for i in range(indx-1,indx+k+10)])
print 'execution time:', extime

PyPyを使用すると、マシン上で1秒未満でC ^ 6が検出されます。
デニス14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.