एक कोलमोगोरोव कॉम्प्लेक्सिटी सॉल्वर लिखें


16

Kolmogorov जटिलता एक स्ट्रिंग के एस कम से कम कार्यक्रम की लंबाई है पी , कुछ प्रोग्रामिंग भाषा में लिखा एल , जिसका उत्पादन ठीक है एस
(हां, वास्तविक परिभाषा अधिक औपचारिक है लेकिन यह चुनौती के लिए पर्याप्त होगा।)

इस चुनौती में आपका काम सबसे कम संभव "कोलमोगोरोव जटिलता सॉल्वर" लिखना है, जो कि एल में ही लिखा गया एक प्रोग्राम है जो एक स्ट्रिंग एस में लेता है और एल में लिखे गए सबसे छोटे पी को रिटर्न करता है जो एस आउटपुट करता है ।

इसके लिए भोली दृष्टिकोण सभी लंबाई 1 कार्यक्रमों पर चलना है, फिर सभी लंबाई 2 कार्यक्रमों, फिर सभी लंबाई 3 कार्यक्रमों, और इसी तरह, उनमें से प्रत्येक को चलाने और आउटपुट को मापने वाले प्रोग्राम तक एस को मिला है। इस दृष्टिकोण के साथ मुद्दा यह है कि इनमें से कुछ कार्यक्रम कभी भी चलना बंद नहीं हो सकते हैं, जिसका अर्थ है कि सॉल्वर स्वयं कभी नहीं रुक सकता है। और रुकने की समस्या के कारण उन कार्यक्रमों से बचने का कोई निश्चित तरीका नहीं है जो बंद नहीं करते हैं।

एक सरल, हालांकि अपूर्ण समाधान प्रत्येक संभावित P के निष्पादन समय पर एक समय सीमा लगाना है । ऐसे कार्यक्रम जो समय पर रुकने के लिए नहीं होते हैं, उन्हें खत्म किया जा सकता है, लेकिन सॉल्वर निश्चित रूप से बंद हो जाएगा (यह मानते हुए कि एल में एक कार्यक्रम वास्तव में समय सीमा के भीतर एस उत्पादन कर सकता है)।

चुनौती

अपने सॉल्वर को एक प्रोग्राम या फ़ंक्शन के रूप में लिखें जो तीन चीजों में लेता है:

  • स्ट्रिंग एस
  • एक सकारात्मक पूर्णांक T जो सेकंड या कुछ छोटे समय अवधि (जैसे मिलीसेकंड) में समय सीमा है।
  • एक स्ट्रिंग एक क्षमता के लिए उपयोग करने के लिए वर्णों की वर्णमाला के पी 'है।

और सबसे छोटा P आउटपुट करता है जिसमें केवल A में अक्षर होते हैं , T समय इकाइयों से कम में चलता है , और S आउटपुट करता है ।

यह सामान्य छद्म कोड है:

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 में वर्णों से बना P हमेशा होगा जो T को आउटपुट S से चलाता है ।
  • आप यह मान सकते हैं कि संभावित P के निष्पादन के साइड इफेक्ट्स नहीं होंगे जो सॉल्वर को सही तरीके से चलने या काम करने से रोकते हैं (जैसे सॉल्वर की आवंटित मेमोरी के साथ खिलवाड़ करना)।
  • आप यह नहीं मान सकते हैं कि संभावित P 'त्रुटि मुक्त हैं। निष्पादन कॉल के आसपास try/ catchब्लॉक या जो भी लागू हो, को शामिल करना सुनिश्चित करें।
  • यदि पी के सबसे छोटे हैं , तो कोई भी पर्याप्त होगा। "लघुता" को बाइट्स वाले वर्णों में मापा जाता है।
  • संभावित P के आउटपुट को stdout (या आपकी भाषा के सामान्य आउटपुट क्षेत्र) पर मुद्रित किया जाता है। खाली स्ट्रिंग एक संभावित P है
  • आदर्श रूप से आपका सॉल्वर A को किसी भी वर्ण को रखने की अनुमति देगा । एक कम से कम होना चाहिए शामिल करने के लिए सक्षम होने के लिए प्रिंट योग्य ASCII वर्ण के साथ साथ टैब और नई-पंक्तियों।
  • इनपुट फ़ाइल / स्टडिन / कमांड लाइन / फंक्शन आर्ग्स से आ सकता है। आउटपुट स्टडआउट या समान के लिए जाता है, या यदि आपने एक फ़ंक्शन लिखा है, तो इसे स्ट्रिंग के रूप में वापस किया जा सकता है।

स्कोरिंग

सबसे कम बाइट्स के साथ सबमिशन जीत जाता है। टाईब्रेकर जल्द से जल्द प्रस्तुत करने के लिए जाता है।


7
मेरा दिमाग दुखता है।
एलेक्स ए।

1
क्या आप इस आवश्यकता को शिथिल कर सकते हैं कि लक्ष्य भाषा और भाषा जो मेटा सॉल्वर में लिखी गई है, समान होनी चाहिए?
n --h'a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

और क्या यह सिर्फ एक कार्यक्रम लिखना संभव नहीं होगा जो आउटपुट को भाषा के स्ट्रिंग शाब्दिक प्रतिनिधित्व में परिवर्तित करता है?
n --h'a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n @h thea̷̭̿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

यह मत चलाना। मेरे कंप्यूटर पर, कम से कम, मुझे यह प्रोग्राम मिला कि एक बार पॉप-अप विंडो के अनुसार चलने की प्रक्रिया शुरू होने पर इसे रोकना वास्तव में कठिन था।

timeouts केवल 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

सभी वैध 0-2 चार पायथन 3 कार्यक्रमों के पास्टिबिन लिंक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.