रूबी, रेव बी 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