quine-ish टिक-टैक-टो


19

अपनी चुनी हुई भाषा में एक कार्यक्रम लिखें जो एक मानव खिलाड़ी के खिलाफ 3 * 3 बोर्ड पर टिक-टैक-पैर की अंगुली का सही खेल खेलता है। हालांकि, हर चाल का एक अलग कार्यक्रम होना चाहिए , जो पिछले पुनरावृत्ति से उत्पन्न होता है।

आप मानव इनपुट का मूल्यांकन किस प्रकार और किस रूप में करते हैं, यह आपके ऊपर है, लेकिन इसे मानक इनपुट से पढ़ना होगा। इसी तरह, आप एक विधि का चयन करने के लिए स्वतंत्र हैं कि आप कैसे निर्धारित करेंगे कि कौन सा खिलाड़ी शुरू होता है (उदाहरण के लिए, आप पहले पूछते हैं, या आप मानव को यह संकेत देने के लिए अमान्य कदम दर्ज करने की अनुमति देते हैं कि कंप्यूटर शुरू होता है, या अन्य विचार)।

चालों को मान्य करना आवश्यक नहीं है, आप काफी हद तक मानव विरोधी खेल मान सकते हैं।

मूल रूप से, आपके पास कार्यक्रम है जो बोर्ड के एक राज्य से मेल खाता है। राज्य को किसी भी पहचानने योग्य तरीके से मुद्रित किया जाता है, लेकिन कम से कम विस्तार के निम्न स्तर की उम्मीद की जाती है:

X..
00X
x..

मानव खिलाड़ी द्वारा अपनी चालों में प्रवेश करने के बाद, आपके प्रोग्राम को उसी भाषा में स्रोत फ़ाइल के रूप में स्वयं की अगली पुनरावृत्ति उत्पन्न करनी होती है (या तो मानक आउटपुट या फ़ाइल में) और समाप्त हो जाती है। आपको उस स्रोत फ़ाइल के बाहर कहीं और जानकारी संग्रहीत करने की अनुमति नहीं है। (यह आपके प्रोग्राम के लिए उत्पन्न प्रोग्राम को बनाने और चलाने के लिए आवश्यक नहीं है, यह उपयोगकर्ता द्वारा किया जा सकता है - हालांकि, यह निषिद्ध नहीं है)। जब उत्पन्न कार्यक्रम बनाया और चलाया जाता है, तो यह समान व्यवहार करेगा, राज्य प्रदर्शित करेगा, उपयोगकर्ता इनपुट की प्रतीक्षा करेगा, आदि।

खेल के अंत में, आपको परिणाम को प्रिंट करना होगा (चाहे आप जीत गए हों या यह टाई हो) किसी भी स्पष्ट पहचान के तरीके से।

परफेक्ट प्ले से मेरा मतलब है कि कार्यक्रम में हार नहीं होनी चाहिए, और अगर जीत के लिए मजबूर करने की संभावना है, तो उसे जीतना चाहिए।

सबसे कम कोड जीतता है , पहली वैध प्रविष्टि के कम से कम 10 दिन बाद विजेता का चयन किया जाता है।

यदि आपके कार्यक्रम का निर्माण और उसके अगले पुनरावृत्ति का शुभारंभ हो सकता है, तो आपको स्कोर में 10% की कमी आती है। (मुझे पता है, यह संभवतः इसके लायक नहीं है) बेशक, कार्यक्रम को उस समय तक समाप्त किया जाना चाहिए जब अगला पुनरावृत्ति उपयोगकर्ता से चालें स्वीकार करता है।

यदि आप कुछ अजीब असामान्य ट्रिक्स का उपयोग करते हैं, तो कृपया अपने कोड के साथ एक संक्षिप्त विवरण पोस्ट करें।


2
अच्छी चुनौती है, लेकिन मुझे लगता है कि मैं ऑप्ट-आउट करने जा रहा हूं।
जॉन ड्वोरक

"हर कदम पर एक अलग कार्यक्रम होना चाहिए"। क्या आपका मतलब है, "प्रत्येक खेल को मूल कार्यक्रम के एक नए, विशिष्ट उदाहरण द्वारा शुरू और प्रबंधित किया जाना है"?
डेविड

1
@DavidCarraher: नहीं। हर कदम, न सिर्फ हर खेल। बोर्ड उदाहरण के नीचे विवरण की जाँच करें। जब कंप्यूटर को एक चाल चलनी होती है (इसलिए बोर्ड की स्थिति बदल जाती है), तो आपके प्रोग्राम को एक सोर्स फाइल जेनरेट करनी होती है, जिसे जब बनाया जाता है और चलाया जाता है, तो वह अगला स्टेट बन जाएगा। मूल कार्यक्रम तब बाहर निकलता है। नव निर्मित कार्यक्रम, जब एक कदम बनाते हैं, तो इसी तरह का व्यवहार करेगा: यह एक स्रोत फ़ाइल बनाता है, जो जब निर्मित और चलता है, तो वह अगली स्थिति बन जाएगी, और इसी तरह। जनरेट की गई स्रोत फ़ाइल को छोड़कर कोई सूचना संग्रहण की अनुमति नहीं है, यह पुनरावृत्तियों के बीच अंतर के साथ एक क्वीन की तरह है।
vsz

जवाबों:


13

पर्ल, 933 अक्षर

$m=<<'';$_='         ';
sub h{/^(?:...)*(\d)\1\1/|/^.?.?(\d)..\1..\1/|/(\d)...\1...\1/|/^..(\d).\1.\1/&&$1}
sub r{substr($_,$p-1,1)=pop}sub p{my$w=pop;my@b=(0,h==$w||h&&-1);if(!$b[1]&&/ /){$b[1]=-9;
while(/ /g){local($_,$p)=($_,pos);r$w;$r=-(p($w^1))[1];@b=($p,$r)if$r>$b[1]}}@b}
if(($w=h||!/ /)||!@ARGV){$w--&&print+(nobody,X,O)[$w]," wins\n";s/(...)/$1\n/g;
tr/ 23/.XO/;print}else{$w=3;$w^=1for/\d/g;($p=pop)?r($w^1)&&!h&&(($p)=p$w)&&r$w:s/ /2/;
print"\$m=<<'';\$_='$_';\n$m\n$m"}

sub h{/^(?:...)*(\d)\1\1/|/^.?.?(\d)..\1..\1/|/(\d)...\1...\1/|/^..(\d).\1.\1/&&$1}
sub r{substr($_,$p-1,1)=pop}sub p{my$w=pop;my@b=(0,h==$w||h&&-1);if(!$b[1]&&/ /){$b[1]=-9;
while(/ /g){local($_,$p)=($_,pos);r$w;$r=-(p($w^1))[1];@b=($p,$r)if$r>$b[1]}}@b}
if(($w=h||!/ /)||!@ARGV){$w--&&print+(nobody,X,O)[$w]," wins\n";s/(...)/$1\n/g;
tr/ 23/.XO/;print}else{$w=3;$w^=1for/\d/g;($p=pop)?r($w^1)&&!h&&(($p)=p$w)&&r$w:s/ /2/;
print"\$m=<<'';\$_='$_';\n$m\n$m"}

कृपया ध्यान दें कि स्क्रिप्ट के बीच में रिक्त लाइन वास्तव में वहां होना आवश्यक है। (लंबी लाइनों के अंत में लाइन टूटने की आवश्यकता नहीं है, लेगबिलिटी के अलावा, और वर्ण गणना में शामिल नहीं हैं।)

उपयोग: जब प्रोग्राम को तर्कों के बिना चलाया जाता है, तो यह वर्तमान गेम स्थिति को प्रदर्शित करता है। चूंकि शुरुआत में बोर्ड खाली है, इसलिए उत्पादन निम्न होगा:

...
...
...

1 और 9 के बीच एक तर्क के साथ कार्यक्रम को चलाएं ताकि उस वर्ग को आपकी चाल के रूप में दावा किया जा सके। कार्यक्रम अपनी खुद की चाल बनाएगा और फिर नए राज्य के साथ एक प्रतिस्थापन स्क्रिप्ट का उत्पादन करेगा। इस प्रकार, उदाहरण के लिए:

$ perl ./qttt 5 > ./qttt-2
$ perl ./qttt-2
O..
.X.
...

केवल पहले मोड़ पर, आप यह 0संकेत देने के लिए एक चाल दे सकते हैं कि कंप्यूटर को पहला कदम उठाना चाहिए। ध्यान दें कि पहला खिलाड़ी हमेशा रहेगा X

जब खेल खत्म हो जाता है, तो प्रदर्शन आउटपुट में उस प्रभाव के लिए एक नोट शामिल होगा:

$ perl ./qttt-4 6 > ./qttt-5
$ perl ./qttt-5
O wins
OXX
OOX
X.O

कार्यक्रम खेल के पेड़ की एक मानक न्यूनतम खोज कर काम करता है। (टिक-टैक-टो एक छोटा सा पर्याप्त गेम है जिसे हर रन पर एक पूरा गेम ट्री बनाया जा सकता है।) इसका अपवाद तब होता है जब कंप्यूटर पहले चलता है - इस मामले में ऊपरी बाएं कोने में शुरुआती चाल कठिन है- कोडित।

ध्यान दें कि यह कार्यक्रम एक उचित क्वीन के फैशन में काम करता है - किसी भी बिंदु पर स्क्रिप्ट अपने उत्पादन का उत्पादन करने के लिए अपने स्वयं के स्रोत फ़ाइल तक नहीं पहुंचती है।


1
वह खूबसूरत है! मुझे नहीं पता था कि मैं यहां सबसे लंबे समय के लिए एक विशाल डॉक पर घूर रहा था, फिर डबल-टेक किया।
जेसी स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.