क्रॉस, नो नौट्स


10

हर कोई महसूस करता है कि टिक टीएसी को पैर की अंगुली एक सुलझा हुआ खेल है। हालांकि, केवल-एक्स के मिसरे संस्करण एक दिलचस्प विकल्प प्रदान करता है।

खेल के इस संस्करण में, दोनों खिलाड़ी बोर्ड पर Xs खेलते हैं और एक पंक्ति में तीन बनाने से बचने की कोशिश करते हैं। यदि आप इसके बारे में अधिक देखना चाहते हैं, तो नंबरफाइल के पास इस अवधारणा के बारे में एक अच्छा वीडियो है।

मिसरे क्रॉस के बोर्ड को देखते हुए, एक इष्टतम चाल खेलें।

एक बोर्ड तीन वर्णों की तीन पंक्तियाँ होती हैं, जो Xया होती हैं । इस प्रकार:

X X
X  
 XX

एक वैध बोर्ड है। आप इसे किसी भी सुविधाजनक प्रारूप में ले सकते हैं, जब तक कि आपका इनपुट और आउटपुट समान प्रारूप का उपयोग न करें। स्वरूपों में शामिल हैं (लेकिन इन तक सीमित नहीं हैं): एक बहु-पंक्ति स्ट्रिंग (वैकल्पिक अनुगामी न्यूलाइन के साथ); पात्रों का 2 डी सरणी जो हैं Xया ; बूलियन मानों का 1D चपटा हुआ सरणी यह ​​दर्शाता है कि प्रत्येक स्थान पर खेला गया है।

एक इष्टतम चाल वह है जो आपको गारंटी देता है कि आप लगातार खेलना जारी रखेंगे या जब तक संभव हो अपने नुकसान को बढ़ा सकते हैं और निम्नलिखित नियमों द्वारा परिभाषित किया जाता है:

  • एक पंक्ति में तीन बनाने से बचें।
  • यदि आप पहले जाते हैं, तो बीच में खेलें।
  • यदि एकमात्र अधिकृत स्थान मध्य है, तो शेष स्थानों में से किसी में भी खेलें।
  • यदि मध्य वर्ग पर कब्जा नहीं है और एक बाहरी वर्ग है, तो अपने प्रतिद्वंद्वी के अंतिम नाटक के विपरीत खेलें।
  • यदि मध्य वर्ग पर कब्जा है और एक बाहरी वर्ग है, तो पिछले चाल से एक "शूरवीरों की चाल" (विपरीत, एक ओवर) खेलें जो आपको खोने का कारण नहीं बनता है।
  • यदि कोई शेष वर्ग नहीं बचा है जहाँ आप नहीं हारेंगे, तो शेष वर्गों में से किसी में भी खेलें।

[नोट: यह एक मामले में गैर-इष्टतम साबित हुआ है, लेकिन आपको इस एल्गोरिथम का उपयोग करना चाहिए।]

आप मान सकते हैं कि आपकी पिछली सभी चालें इष्टतम थीं। इस प्रकार, पहला उदाहरण बोर्ड एक वैध इनपुट नहीं है। आपके प्रतिद्वंद्वी की चाल इष्टतम हो सकती है या नहीं।

यदि खेल समाप्त हो गया है (यानी एक पंक्ति में तीन बनाया गया है), तो व्यवहार अपरिभाषित है।

जैसा कि यह , बाइट्स जीत में सबसे छोटा जवाब!

केवल संभावित चालों का उपयोग करते हुए एक संभव पथ यह है:

[   ]  [   ]  [X  ]  [X  ]  [X  ]  [X  ]  [XX ]
[   ]->[ X ]->[ X ]->[ XX]->[ XX]->[ XX]->[ XX]
[   ]  [   ]  [   ]  [   ]  [ X ]  [XX ]  [XX ]

गैर-इष्टतम चाल का उपयोग करके प्रतिद्वंद्वी से उत्पन्न होने वाले संभावित इनपुट यहां दिए गए हैं:
(ध्यान दें कि इस सूची में केवल बाईं ओर वाले बोर्ड ही उपयुक्त इनपुट हैं)

[X  ]  [X  ]
[   ]->[   ]
[   ]  [  X]

[XX ]  [XX ]
[   ]->[   ]
[  X]  [ XX]

[XX ]  [XX ]
[X  ]->[X X]
[ XX]  [ XX]


इनपुट और आउटपुट प्रारूप क्या हैं? मैं एक सरणी या स्ट्रिंग के रूप में लिया गया बोर्ड मान रहा हूं? हालाँकि यह अंतिम कदम पर जानकारी प्रदान नहीं करता है, इसलिए मेरा अगला प्रश्न है।
लेवल रिवर सेंट

1
रणनीति "अपने प्रतिद्वंद्वी के पिछले नाटक के विपरीत खेलते हैं" या तो अपने प्रतिद्वंद्वी के चाल इतिहास के ज्ञान को मानती है, या कि आपने पहले इस रणनीति का पालन किया है, .XX\nX..\nX..उदाहरण के लिए जैसे बोर्ड को विरासत में नहीं मिला है । क्या हमें इस तरह के विरासत वाले बोर्डों पर विचार करना होगा?
लेवल रिवर सेंट

@LevelRiverSt जैसा कि लिखा गया है, "आप मान सकते हैं कि आपकी पिछली सभी चालें इष्टतम थीं," ताकि बोर्ड अवैध इनपुट हो जाए। आप जो भी प्रारूप पसंद करते हैं उसमें इनपुट ले सकते हैं, लेकिन एक मल्टी लाइन स्ट्रिंग जैसे कि आपका उदाहरण "डिफ़ॉल्ट" होगा: मैं सिर्फ स्टर्लिंग को पार्स करने के लिए किसी को प्रतिबंधित नहीं करना चाहता जब चाल तर्क का बिंदु है चुनौती।
12 नवंबर को CAD97

जवाबों:


3

रूबी, रेव बी 121 बाइट्स

सबमिशन अनाम फ़ंक्शन है, माइनस द f=। उपयोग दिखाने के लिए परीक्षण कार्यक्रम में दिखाया गया है।

f=->n{["~mK)\7","}uYwQO"][l=n%2].bytes{|t|9.times{|i|(m=n|1<<i)==n||8.times{|j|m/2*257>>j&255==126-t&&t+j%2!=119&&l=m}}}
l}

puts g=f[gets.to_i]
puts
[7,6,5,
 8,0,4,
 1,2,3].each{|i|print g>>i&1; puts if i/3==1}

2 बाइट्स केंद्र को सबसे महत्वपूर्ण बिट के बजाय कम से कम महत्वपूर्ण बिट बनाकर बचाया जाता है ( स्वीकार्य के /2बजाय हटाएं %256।) स्वीकार्य चाल की तालिका के पुनर्गठन से बचत। एक सरल परीक्षण के लिए X की अनुमति की कुल संख्या के बजाय केंद्र वर्ग मुक्त / कब्जे के रूप में आयोजन। इसके अलावा, अब सरणी में केवल 2 स्ट्रिंग्स हैं इसलिए %w{string1 string2}सिंटैक्स को सिंटैक्स के पक्ष में छोड़ दिया गया ["string1","string2"]है। यह एक गैर-विशिष्ट वर्ण \7को शामिल करने में सक्षम बनाता है, जो बदले में एक सरल एन्कोडिंग का उपयोग करने में सक्षम बनाता है: 126-tइसके बजाय (36-t)%120

रूबी, एक 143 बाइट्स रेव

->n{l=r=("%b"%n).sum%8
%w{$ %5 - I+Wy Q S#}[r].bytes{|t|9.times{|i|(m=n|1<<i)==n||8.times{|j|m%256*257>>j&255==(t-36)%120&&t+j%2!=43&&l=m}}}
l}

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

स्वीकार्य आउटपुट की तुलना में कहीं अधिक संभावित इनपुट हैं, इसलिए एल्गोरिथ्म सभी चालों को आज़माने के लिए है, और एक स्वीकार्य आउटपुट पैटर्न फिट बैठता है। X की प्रत्येक संख्या के लिए स्वीकार्य आउटपुट पैटर्न हार्डकोड हैं।

केंद्र वर्ग के बारे में जानकारी छीन ली गई है और शेष 8 बिट्स को नकल करने के लिए 257 से गुणा किया जाता है। इस पैटर्न को राइट-शिफ्ट करके स्वीकार्य पैटर्न को घुमाया जाता है।

एक पैटर्न मिलने पर लूप को बाहर नहीं निकाला जाता है, इसलिए लौटा हुआ पैटर्न पाया जाने वाला सबसे लंबा पैटर्न होगा। इस कारण से, बेहतर पैटर्न (जहां वरीयता है) सूची में बाद में आते हैं।

Importance नाइट्स मूव ’की रणनीति को देखते हुए यह बहुत कम महत्व रखता है कि कोई पैटर्न 45 डिग्री तक घुमाया जाता है या नहीं। अनगुल्ड संस्करण शूरवीरों की चाल की रणनीति का अनुसरण करता है और इसलिए कोने के चौकों और किनारे के चौकों के बीच अंतर करने की आवश्यकता नहीं होती है: पंक्ति में तीन को वैसे भी टाला जाना है।

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

परीक्षण कार्यक्रम में अपराजित

असंगठित संस्करण प्रश्न में व्यक्त तर्क का अनुसरण करता है।

गोल्फ संस्करण [[0],[1,17],[9],[37,7,51,85],[45],[47,119]]में मामले के लिए थोड़ा अलग व्यवहार लागू करने के लिए तालिका को थोड़ा संशोधित किया गया है r=3। यह तब मुद्रण योग्य ASCII (डिकोडिंग की आवश्यकता (t-36)%120) के लिए संकुचित होता है । टेबल एंट्री 3 के मामले में एक कोने में तीन एक्स के बीच और तीन एक्स के बीच अंतर करने के लिए एक अतिरिक्त बिट तर्क की आवश्यकता होती है:&&t+j%2!=43

f=->n{l=r=("%b"%n).sum%8                                      #convert input to text, take character checksum to count 1's(ASCII 49.) 
                                                              #0 is ASCII 48, so %8 removes unwanted checksum bloat of 48 per char.
                                                              #l must be initialised here for scoping reasons.
  [[0],[1,17],[9],[11,13,37,51,85],[45],[47,119]][r].each{|t| #according to r, find the list of acceptable perimeter bitmaps, and search for a solution.
    9.times{|i|(m=n|1<<i)==n||                                #OR 1<<i with input. if result == n, existing X overwritten, no good.
                                                              #ELSE new X is in vacant square, good. So.. 
      8.times{|j|m%256*257>>j&255==t&&l=m}}                   #%256 to strip off middle square. *257 to duplicate bitmap.
                                                              #rightshift, see if pattern matches t. If so, write to l
  }
l}                                                            #return l (the last acceptable solution found) as the answer.

#call function and pretty print output (not part of submission)
puts g=f[gets.to_i]
puts
[6,7,0,
 5,8,1,
4,3,2].each{|i|print g>>i&1; puts if i<3}

परीक्षण कार्यक्रम का आउटपुट

यह तब होता है जब कंप्यूटर खुद खेलता है।

C: \ Users \ steve> रूबी tictac.rb
0
256

000
010
000

C: \ Users \ steve> रूबी tictac.rb
256
384

010
010
000

C: \ Users \ steve> रूबी tictac.rb
384
400

010
010
100

C: \ Users \ steve> रूबी tictac.rb
400
404

010
010
101

C: \ Users \ steve> रूबी tictac.rb
404
436

010
110
101

C: \ Users \ steve> रूबी tictac.rb
436
444

010
110
111

खेल विश्लेषण खेल पहले

यह वास्तव में बहुत सरल और रैखिक है।

पहले खेलते समय, मध्य वर्ग हमेशा पहले वर्ग का कब्जा होगा।

आर = 0

...  binary representation 0
.X.
...

आर = 2

X..  binary representation 1001=9 
.XX
...

आर = 4

X.. binary representation 101101=45
.XX
XX.

पांच एक्स का केवल एक ही तरीका है (समरूपता के लिए) खेल के खत्म होने के बिना बोर्ड पर मध्य वर्ग के पांच एक्स शामिल हैं। मध्य वर्ग में एक X है, प्रत्येक विकर्ण पर एक (90 डिग्री से एक दूसरे पर) और प्रत्येक क्षैतिज / ऊर्ध्वाधर सेंट्रीलाइन पर (एक दूसरे से 90 डिग्री पर)। एक पूरे किनारे के रूप में ऊपर कब्जा नहीं किया जा सकता है। व्यवस्था संभव है। अन्य खिलाड़ी को अगले कदम पर हारना होगा।

खेल विश्लेषण खेल सेकंड

यदि दूसरा खिलाड़ी मध्य वर्ग चुनता है, तो यह काफी अलग है।

r = 1

मध्य वर्ग ने कब्जा कर लिया

.X. X..  binary representation 1 
.X. .X.
... ...

मध्य वर्ग मुक्त

X.. .X. binary representation 10001=17
... ...
..X .X.

आर = 3

मध्य वर्ग ने कब्जा कर लिया है, अगर अन्य खिलाड़ी आपके अंतिम एक्स से सटे खेलता है, तो शूरवीरों की चाल खेलने के लिए नीचे दिए गए संस्करण में समर्थित है

XX. .XX binary representation 1011=11 
.X. XX. or mirror image 1101=13
X.. ...

हालांकि उपरोक्त सबसे अच्छा कदम नहीं है और गोल्फ संस्करण में समर्थित नहीं है। सबसे अच्छी चाल इस प्रकार है, अगली पारी में जीत हासिल करना:

XX. binary representation 111=7.           XXX
XX. Only to be used where j is odd.        .X.
... Even j would look like image to right. ...

मध्य वर्ग ने कब्जा कर लिया है, अगर अन्य खिलाड़ी आपके अंतिम एक्स के लिए 90 या 135 डिग्री पर खेलता है (नाइट की दूर ले जाएँ।)

X.X .X. binary representation 100101=37 
.X. .XX
.X. X..

मध्य वर्ग मुक्त

X.X .X. XX. binary representations:
... X.X ...    1010101=85 (first two)
X.X .X. .XX and 110011=51 (last one)

आर = 5

मध्य वर्ग ने कब्जा कर लिया। उपरोक्त कारणों से r = 4 में, चार संभावित चालें हैं, जिनमें से सभी खो जाती हैं। केवल एक समर्थित है: 101111 = 47

मध्य वर्ग मुक्त। समरूपता तक केवल एक ही संभव बोर्ड है, निम्नानुसार है। अन्य खिलाड़ी को अगले कदम पर हारना होगा, इसलिए r> 5 का समर्थन करने की कोई आवश्यकता नहीं है।

XX. binary representation 1110111=119
X.X
.XX

यह एक अद्भुत जवाब है! मुझे लगा कि मैंने इष्टतम मो के लिए सभी मामलों की जाँच की है, लेकिन मुझे लगता है कि मैं एक चूक गया। हालांकि सादगी के लिए कल्पना वही रहेगी। (ऐसा करने के लिए वास्तव में यह अद्भुत धन्यवाद है और यह इतनी अच्छी तरह से समझाया गया है! मैंने I / O को छोड़ दिया ताकि लोग इस तरह से अद्भुत प्रदर्शन कर सकें।)
CAD97

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