এই অসীম স্ট্রিংয়ে রান কোথায়? (সিসিসিসিসি পাওয়া গেছে!)


25

স্ট্রিং দিয়ে শুরু করে ABCবার বার নিজেকে শেষের অর্ধেক যোগ করার ফলাফলটি বিবেচনা করুন (দৈর্ঘ্যটি বিজোড় হলে বৃহত্তর অর্ধেক ব্যবহার করে)।

আমরা অগ্রগতি পেতে:

ABC
ABCBC
ABCBCCBC
ABCBCCBCCCBC
ABCBCCBCCCBCBCCCBC
etc...

আসুন Sফলস্বরূপ অসীম স্ট্রিং (বা ক্রম) উপস্থাপন করুন যে ফলাফলটি চিরতরে পুনরাবৃত্তি হয় results

লক্ষ্য

এই কোড প্রতিদ্বন্দ্বিতায় লক্ষ্যের রানে প্রথম ঘটনার সূচক খুঁজে পেতে C's S

এটি প্রথমে সহজ: Cসূচকগুলিতে প্রথমে ঘটে 2, CCat 4, CCCat 7, CCCCat 26তবে CCCCCসমস্তভাবে সূচকে হয় 27308! এরপরে আমার স্মৃতি ফুরিয়ে যায়।

বিজয়ী হ'ল জমা দেওয়া যা সঠিকভাবে সর্বাধিক রান সূচকগুলি তৈরি করে (যাতে শুরু করে C)। আপনি যে কোনও ধরণের অ্যালগরিদম ব্যবহার করতে পারেন তবে আপনি যদি বেসল ব্রুট ফোর্সটি ব্যবহার না করে থাকেন তবে এটিকে ব্যাখ্যা করতে ভুলবেন না। ইনপুট এবং আউটপুট যে কোনও সহজ ফর্ম্যাট বুঝতে পারে।

গুরুত্বপূর্ণ দ্রষ্টব্য: আমি Sআসলে আনুষ্ঠানিকভাবে জানি না যে এর সমস্ত রান রয়েছে C। এই প্রশ্নটি গাণিতিক স্ট্যাক এক্সচেঞ্জের এই প্রশ্নটি থেকে নেওয়া হয়েছে , যেখানে লেখকও খুঁজে পান CCCCCCনি। আমি এখানে কৌতূহলী যদি এখানে কেউ পারেন। (এই প্রশ্নটি আমার মূল প্রশ্নের উপরে ভিত্তি করে ফিরে আসে ))

আপনি যদি প্রমাণ করতে পারেন যে সমস্ত রানই Cঘটে না Sতবে আপনি স্বয়ংক্রিয়ভাবে জিতবেন যেহেতু এই প্রশ্নটি আর বৈধ হবে না। যদি কেউ তা প্রমাণ করতে না পারে এবং খুঁজে না পায় CCCCCCতবে বিজয়ী হবেন এমন ব্যক্তি যিনি সূচকে সর্বোচ্চ নিম্নতম বাউন্ড পেতে পারেন CCCCCC(বা সবচেয়ে বড় অমীমাংসিত রান যদি CCCCCCপাওয়া যায় তবে তা পাওয়া যায়)।

আপডেট: আইস্যাক এবং রেস থেকে হিউমোনাস কুদোস যারা CCCCCC2.124 * 10 ^ 519 এর জ্যোতির্বিদ্যা সূচকে খুঁজে পেয়েছেন। এই হারে আমি এমন CCCCCCCকোনও পদ্ধতির সাথে অনুসন্ধানের কল্পনা করতে পারি না যা জন্তুটির উপর নির্ভর করে। ভাল কাজ বলছি!


আমি এটি পাই না - আপনি বলছেন যে আপনি CCCCCসূচক 27308 এ পেয়েছেন, তবে পরে মনে হচ্ছে এটি প্রথম কোথায় ঘটেছিল তা আপনি জানেন না। মানে CCCCCC?
isaacg

@ আইসাকগ ওফস 6 সি এর সন্ধান করা কঠিন। আমি এটা ঠিক করব।
ক্যালভিনের শখ

যদি অনুমানটি ভুল হয় তবে একটি এন রয়েছে যার জন্য c ^ N দীর্ঘতম রান। আমি দৃ sure়ভাবে নিশ্চিত যে একটি দীর্ঘ ক্রম নির্মান করা সম্ভব হওয়া উচিত, এটি দ্বন্দ্বের দিকে পরিচালিত করে এবং অনুমানকে প্রমাণ করে। আমি এটি খুব কঠিন বলেও মনে করি না, তবে অন্যদিকে সমস্যাগুলি সহজেই
হ্রাস করা

আমি আমার নতুন ব্যাচের ভোটের সাথে মধ্যরাতে এখানে অবশ্যই আসছি - প্রশ্ন এবং উত্তর উভয়ের জন্য!
ট্রিকোপল্যাক্স

যারা অনুসন্ধান করছেন তাদের জন্য এটি কিছুটা সহজ করে তুলতে পারে: আপনি যদি প্রথম "এ" সরিয়ে থাকেন তবে আপনাকে কেবল "এবি" দিয়ে খেলতে হবে এবং পরবর্তী পুনরাবৃত্তির জন্য আপনি অর্ধ + 1 যুক্ত করবেন।
ফ্যাকোরাল

উত্তর:


23

সিসিসিসিসিসি 2.124 * 10 ^ 519 এ পাওয়া গেছে।

সঠিক সূচক 2124002227156710537549582070283786072301315855169987260450819829164756027922998360364044010386660076550764749849261595395734745608255162468143483136030403857241667604197146133343367628903022619551535534430377929831860918493875279894519909944379122620704864579366098015086419629439009415947634870592393974557860358412680068086381231577773140182376767811142988329838752964017382641454691037714240414750501535213021638601291385412206075763857490254382670426605045419312312880204888045665938646319068208885093114686859061215 হয়

অনুসন্ধানের 3.5 ঘন্টা পরে নীচে (পুরানো সংস্করণ) কোডটি ব্যবহার করে রেস দ্বারা পাওয়া গেছে by

সেই সূচকের চারপাশে, স্ট্রিংটি হ'ল: ...BCCBCBCCCBCCCCCCBCCB...

যাচাই করতে, নীচের কোডে সূচিত লাইনটি 5 পরিবর্তে 2946 এ শুরু করতে পরিবর্তন করুন, যাচাইকরণটিতে 20 সেকেন্ড সময় লাগে

আপডেট: উন্নত প্রোগ্রাম। পুরানো প্রোগ্রামটি প্রয়োজনের তুলনায় 10x ডলার বেশি অনুসন্ধান করেছে।

নতুন সংস্করণটি 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


এই পাইথন ঠিক আছে?
ক্যালভিনের

হ্যাঁ, আমি এটি যোগ করব।
isaacg

(+1) আপনার প্রোগ্রামটি sys.setrecursionlimit(4000)এবং এর সাথে ULIMIT=4000, (আমার সিস্টেমে প্রায় 3.5 ঘন্টা মধ্যে) ইনডেক্স = 2.124 * 10 ^ 519 এ সিসিসিসিসির প্রথম উপস্থিতি। সঠিক সূচক পরবর্তী মন্তব্যে রয়েছে ...
মাঝামাঝি

3
2124002227156710537549582070283786072301315855169987260450819829164756027922998360364044010386660076550764749849261595395734745608255162468143483136030403857241667604197146133343367628903022619551535534430377929831860918493875279894519909944379122620704864579366098015086419629439009415947634870592393974557860358412680068086381231577773140182376767811142988329838752964017382641454691037714240414750501535213021638601291385412206075763857490254382670426605045419312312880204888045665938646319068208885093114686859061215
মাঝামাঝি

অসাধারণ! সফল হওয়ার এত কাছাকাছি ছিল বলে আমি কখনই সন্দেহ করি না।
isaacg

12

সিসিসিসিসিসি 2.124 * 10 ^ 519 এ পাওয়া গেছে।

নিম্নলিখিত রুবি কোডটি অনুসন্ধান করার জন্য ব্যবহৃত হয়েছিল 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]}*""

সূচিটি @ আইস্যাকের উত্তর হিসাবে একই ।

6 এর জন্য উপরের কোডটির রানটাইমটি আমার কম্পিউটারে দশ সেকেন্ডের ক্রম। তবুও, এটি এখনও একটি উত্তর অনুসন্ধান করছে CCCCCCC(আপনি যদি এটি চেষ্টা করতে চান তবে নিজেকে স্থির SEARCHকরে দিন 7)।

getcঅক্ষরটি একটি নির্দিষ্ট অবস্থানে সন্ধান করতে ব্যবহার করতে পারেন কারণ এটি iশেষ লাইনে যেখানে সূচকের চারপাশে স্ট্রিংটি মুদ্রিত হয় সেখানে করা হয়।


ভাল কাজ এটির গতি বাড়িয়েছে - আমার সমাধানটি খুব রুক্ষ এবং অপরিবর্তিত।
isaacg

কিছু অদ্ভুত: আমি উপরের কোডটি পুনরাবৃত্তি # 34000 পর্যন্ত চালিয়েছি ব্রেকটি সরিয়ে এবং পরীক্ষাগুলি কিছুটা পরিবর্তন করার পরে এবং এটি কেবলমাত্র একটি রান পেয়েছে 6.. কোডটি নিয়ে কি এটি সমস্যা (আমি সন্দেহ করি) বা এটি কি কেবল ক্রমটির একটি বিজোড় সম্পত্তি?
isaacg

@ আইসএইচজি নোট করুন যে আমরা কেবলমাত্র প্রতিটি ক্রমগুলির বিরতি পরীক্ষা করি এবং এইভাবে সমস্ত অনুলিপি-সিকোয়েন্স সি ^ 6 মিস করি। বিরতিতে এগুলি খুব বিরল বলে মনে হয় - এইভাবে আমি মনে করি আমরা শীঘ্রই একটি সি ^ 7 দেখতে পাব না।
হাওয়ার্ড

আমি জানি, তবে যেহেতু একটি মাত্র 2946 পুনরাবৃত্তির পরে একটি ক্রম বিরতিতে পাওয়া গেছে, তাই আমি 40000 পুনরাবৃত্তির দ্বারা দ্বিতীয়টি দেখতে পাব, যেখানে এখন আমি এখানে আছি।
isaacg

@ আইসএইচজি আপনি এখানে (অনেক বেশি দ্রুত) কোডটি ব্যবহার করতে পারেন: ideone.com/HoEKOB । এমনকি এটির সাথে আমি সিকোয়েন্স পয়েন্টে আরও একটি সি ^ 6 খুঁজে পাইনি (এমনকি একটি সি ^ 7 এর চেয়েও কম)।
হাওয়ার্ড

5

(কোনও উত্তর নয়, তবে একটি মন্তব্যের জন্য খুব দীর্ঘ))

নীচে @ হাওয়ার্ডের রুবি প্রোগ্রামটির পাইথন অনুবাদ রয়েছে (অনুসন্ধান লুপটিতে কেবল একটি করে 3 এর কাছাকাছি একটি ফ্যাক্টর দ্বারা ছড়িয়ে পড়ে getc)। আমার সিস্টেমে এটি 3 সেকেন্ডের মধ্যে প্রথম সি ^ 6 সন্ধান করে। 93 ঘন্টার মধ্যে, এটি 231,000 পুনরাবৃত্তিতে কোনও সি ^ 7 খুঁজে পায় না, তাই প্রথম সি ^ 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

পাইপাইয়ের সাহায্যে এটি আমার মেশিনে এক সেকেন্ডেরও কম সি ^ 6 সন্ধান করে।
ডেনিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.