একটি কলমোগোরভ কমপ্লেসিটি সলভার লিখুন


16

Kolmogorov জটিলতা একটি স্ট্রিংয়ের এস সবচেয়ে কম প্রোগ্রামের দৈর্ঘ্য হল পি , কিছু প্রোগ্রামিং ভাষায় লেখা এল , যার আউটপুট ঠিক এস
(হ্যাঁ, আসল সংজ্ঞাটি আরও আনুষ্ঠানিক তবে এটি চ্যালেঞ্জের পক্ষে যথেষ্ট))

এই প্রতিদ্বন্দ্বিতায় আপনার টাস্ক সম্ভাব্য স্বল্পতম "Kolmogorov জটিলতা সমাধানকারী", যে, লেখা একটি প্রোগ্রাম লিখতে হয় এল নিজেই যে একটি স্ট্রিং লাগে এস এবং আয় সবচেয়ে কম পি লেখা এল যে আউটপুট এস

এর নিখুঁত পন্থাটি হল সমস্ত দৈর্ঘ্য 1 টি প্রোগ্রাম, তারপরে সমস্ত দৈর্ঘ্য 2 টি প্রোগ্রাম, তারপরে সমস্ত দৈর্ঘ্য 3 টি প্রোগ্রাম এবং এরপরে, প্রতিটি চালানো এবং এস আউটপুট এমন কোনও প্রোগ্রাম পাওয়া না পাওয়া পর্যন্ত আউটপুট পরিমাপ করা । এই পদ্ধতির সাথে সমস্যাটি হ'ল এই প্রোগ্রামগুলির মধ্যে কয়েকটি কখনও চলমান বন্ধ করে দিতে পারে যার অর্থ হ'ল সমাধানকারী নিজে কখনও থামতে পারে না। এবং থামার সমস্যার কারণে যে প্রোগ্রামগুলি থামছে না তা এড়ানোর কোনও নিশ্চিত আগুনের উপায় নেই।

একটি সহজ, যদিও অপূর্ণ সমাধান হ'ল সম্ভাব্য পি এর প্রত্যেকের সম্পাদনের সময়সীমা নির্ধারণ করা । যে প্রোগ্রামগুলি যে সময়ের মধ্যে থামতে হবে না তা অতিক্রান্ত হতে পারে তবে সমাধানকারী অবশ্যই বন্ধ হয়ে যাবে (ধরে নিই যে এল-তে কোনও প্রোগ্রাম প্রকৃতপক্ষে সময়সীমার মধ্যে এস আউটপুট আনতে পারে)।

চ্যালেঞ্জ

আপনার সমাধানকারীকে একটি প্রোগ্রাম বা ফাংশন হিসাবে লিখুন যা তিনটি জিনিস গ্রহণ করে:

  • স্ট্রিং এস
  • একটি ধনাত্মক পূর্ণসংখ্যা টি যা সেকেন্ডে সময় সীমা বা কিছুটা ছোট সময়কাল (যেমন মিলি সেকেন্ড)।
  • একটি স্ট্রিং একটি সম্ভাব্য জন্য ব্যবহার করতে অক্ষরের বর্ণমালার পি 's।

এবং সবচেয়ে সংক্ষিপ্ত পি আউটপুট করে যা কেবলমাত্র A তে অক্ষর রাখে , টি সময়ের চেয়ে কম সময়ের মধ্যে চলে এবং এসকে আউটপুট দেয় ।

এটি সাধারণ সিউডোকোড:

Function KolmogorovComplexitySolver(S, T, A):
    Assign N to 0
    Loop until function returns:
        In any order, iterate over all strings of length N that only contain characters from *A*. Call the current string P:
            Execute P, saving the output to O, stopping the execution if it takes longer than time T
            If (P did not throw any errors) and (P did not timeout) and (O and S are identical):
                Return P
        Add 1 to N

বিস্তারিত

  • আপনি ধরে নিতে পারেন যে সবসময় A এর অক্ষরগুলি থেকে পি তৈরি করা হবে যা সময় টিতে সঞ্চালিত হয় যা এসকে ছাড়িয়ে যায় ।
  • আপনি ধরে নিতে পারেন যে সম্ভাব্য পি এর কার্যকর করার কোনও পার্শ্ব প্রতিক্রিয়া নেই যা সলভারকে সঠিকভাবে চালানো বা কাজ করা থেকে বিরত করে না (যেমন সলভারের বরাদ্দকৃত মেমরির সাথে গোলযোগ)।
  • আপনি ধরে নিতে পারেন না যে সম্ভাব্য পি এর ত্রুটিমুক্ত। এক্সিকিউশন কলের আশেপাশে try/ catchব্লক বা যা কিছু প্রযোজ্য তা অবশ্যই অন্তর্ভুক্ত করুন।
  • যদি একাধিক সংক্ষিপ্ত পি থাকে তবে যে কোনওটি যথেষ্ট। "স্বল্পতা" বাইটগুলি না করে অক্ষরে পরিমাপ করা হয়।
  • সম্ভাব্য পি এর আউটপুট হ'ল স্টডআউট (বা আপনার ভাষার স্বাভাবিক আউটপুট অঞ্চল) এ মুদ্রিত। খালি স্ট্রিং একটি সম্ভাব্য পি
  • মূলত আপনার সমাধানকারী অনুমতি দেবে একটি যে কোন অক্ষর ধারণ করে। একটি ছাপার যোগ্য ASCII অক্ষর প্লাস ট্যাব এবং নতুনলাইন ধারণ করতে সক্ষম হতে হবে ।
  • ইনপুট ফাইল / স্টিডিন / কমান্ড লাইন / ফাংশন আরগগুলি থেকে আসতে পারে। আউটপুট স্টডআউট বা অনুরূপে চলে যায় বা আপনি কোনও ফাংশন লিখলে স্ট্রিং হিসাবে ফিরে আসতে পারে।

স্কোরিং

সবচেয়ে কম বাইটস সহ জমাটি জয়লাভ করে। টাইব্রেকার প্রথম পোস্ট জমা দেওয়া যায়।


7
আমার মাথা আঘাতপ্রাপ্ত.
অ্যালেক্স এ।

1
আপনি যে প্রয়োজনীয়তাটি মেটা সলভার লিখেছেন তা যে ভাষা এবং ভাষা একই হতে হবে তা শিথিল করতে পারেন?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

এবং কেবল কি কোনও প্রোগ্রাম লিখতে সম্ভব হবে না যা আউটপুটকে ভাষার আক্ষরিক উপস্থাপনে রূপান্তরিত করে?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ না, মূল কথাটি এটি একই ভাষায় করা। হ্যাঁ, তবে এটি সর্বদা সংক্ষিপ্ত প্রোগ্রাম হবে না।
ক্যালভিনের শখ

@ ক্যালভিনের শখগুলি: সুতরাং শেষ পর্যন্ত, কোন ভাষা সহজেই ভাষাটি সংকলন করার জন্য কোন ভাষা সহজেই কোড কল করতে সুবিধা (বা অনুপস্থিত যেখানে সংকলক প্রয়োগ করতে পারে) কোড লিখতে পারে তা সন্ধান করা কেবল একটি কোড গল্ফ চ্যালেঞ্জ?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

উত্তর:


11

পাইথন 3, 240 236 বাইট

import subprocess as s,itertools as i
def f(S,T,A,N=0):
 while 1:
  for P in i.product(A,repeat=N):
   try:
    P="".join(P);open("a","w").write(P)
    if s.check_output(["py","-3","a"],timeout=T).decode()==S:return P
   except:1
  N+=1

এটি চালাবেন না। আমার কম্পিউটারে, অন্ততপক্ষে, প্রোগ্রামটি প্রতি প্রক্রিয়া অনুযায়ী তৈরি পপ-আপ উইন্ডোজগুলির কারণে এটি চালু হওয়া শুরু করার পরে প্রোগ্রামটি থামানো সত্যিই খুব কঠিন।

timeoutগুলি কেবল subprocess.check_outputপাইথন 3 এ যুক্ত করা হয়েছিল, এজন্য আমরা পাইথন 2 এর পরিবর্তে এটি ব্যবহার করছি।

এখানে একটি বিকল্প সংস্করণ রয়েছে time.sleepযা সেই পথে পাওয়া সমস্ত বৈধ প্রোগ্রাম এবং সেই সাথে সম্পর্কিত আউটপুট প্রিন্ট করে:

import subprocess as s,itertools as i
import time
def f(S,T,A,N=0):
 while 1:
  for P in i.product(A,repeat=N):
   time.sleep(0.2)
   try:
    P="".join(P);open("a","w").write(P);C=s.check_output(["py","-3","a"],timeout=T).decode()
    print(P,repr(C))
    if C==S:return P
   except:1
  N+=1

প্রোগ্রামটি aপ্রতিটি প্রোগ্রামের Pপরীক্ষার জন্য ফাইলের নাম ব্যবহার করে , তাই আপনি যদি এটি চালনা করেন তবে নিশ্চিত হয়ে নিন যে আপনার কাছে ইতিমধ্যে সেই নামের কোনও ফাইল নেই। ["py","-3","a"]আপনার সেটআপের জন্য উপযুক্ত কমান্ডটি প্রতিস্থাপন করুন (যেমন ["python","a"]বা ["python3","a"])।

sleepআপনার নিজের ঝুঁকিতে সময়কাল পরিবর্তন করতে নির্দ্বিধায় :) কল করুন f("1\r\n",1,"1()print"), যেখানে Tসেকেন্ডে সময়সীমা শেষ।

উপরের কল দিয়ে পরীক্ষক থেকে আউটপুট প্রথম কয়েক লাইন:

 ''
1 ''
11 ''
() ''
111 ''
(1) ''
int ''
1111 ''

(আপনি একটি বিট বরাবর প্রোগ্রাম সাহায্য করতে চান তাহলে আপনি পরিবর্তন করতে পারেন P="".join(P)থেকে P="print"+"".join(P))

যেহেতু উপরের প্রোগ্রামগুলির কোনও আউটপুট নেই, তাই ফলাফল এখানে রয়েছে f("1\r\n",1,["print","(",")","1"])(টোকেনগুলি চ্যালেঞ্জের অংশ নয়, তবে আমি কী দেখাতে চাইছিলাম):

 ''
print ''
1 ''
() ''
11 ''
print() '\r\n'
(print) ''
(1) ''
111 ''
print(print) '<built-in function print>\r\n'
print(1) '1\r\n'

ফেরতের মানটি স্ট্রিং 'print(1)'

অবশেষে, শুধু মজার জন্য, এখানে কি কিছু ঘটে তাহলে বর্ণমালা হয় string.printable, অর্থাত্

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c

পাইথন 3 প্রোগ্রামের সমস্ত বৈধ 0-2 টির প্যাস্টবিন লিঙ্ক

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