पायथन 2: 399 401 349 333 317 370 बाइट्स
2x बग फिक्स: l4m2 को क्रेडिट
-52 चार्ट: अंडरग्राउंडोरेल को श्रेय
-16 चार्ट: जोनाथन फ्रेच को श्रेय
-26 वर्ण: श्रेय user202729 को
def f(b):
t=4,9,2,3,5,7,8,1,6;n=lambda k:[t[i]for i,j in enumerate(b)if j==k];p,o,a,I=n(2),n(1),n(0),t.index
for i in p:
for j in p:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in o:
for j in o:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in 9,3,7,1:
if i in a and 5 in p:return I(i)
for i in 5,4,2,8,6:
if i in a:return I(i)
return I(a[0])
इसे ऑनलाइन आज़माएं!
एक लीनियर बीजगणित पाठ्यक्रम के पहले दिन मैंने अंतिम सेमेस्टर में प्रवेश लिया, मेरे अस्सिटेंट ग्रेजुएट छात्र प्रशिक्षक ने प्रस्ताव रखा कि यदि आप मैट्रिक्स के रूप में टिक-टैक-टो बोर्ड का प्रतिनिधित्व करते हैं:
4 | 9 | 2
--+---+--
3 | 5 | 7
--+---+--
8 | 1 | 6
फिर एक पंक्ति में तीन प्राप्त करना रेंज में तीन संख्याओं को चुनने के बराबर है [1,9] जो 15 तक जोड़ता है। यह उत्तर इस विचार का फायदा उठाता है। फ़ंक्शन एक सूची लेता है जिसमें बोर्ड का प्रतिनिधित्व करने वाले नौ नंबर होते हैं। 0 एक खाली स्थान को इंगित करता है, 1 प्रतिद्वंद्वी द्वारा कब्जा कर लिया जाता है, और 2 कार्यक्रम द्वारा बनाए गए पिछले नाटक का प्रतिनिधित्व करता है। पहले 3 लाइनों में यह पता चलता है कि प्रोग्राम ने क्या नंबर उठाए हैं (पी), विपक्ष ने (ओ) उठाया है, और अभी भी उपलब्ध हैं (ए)। यह तब उपलब्ध नंबरों के माध्यम से देखता है और देखता है कि उनमें से कोई भी, दो नंबरों के साथ मिलकर इसे पहले से ही पंद्रह में जोड़ दिया है। यदि ऐसा होता है, तो वह उस वर्ग को चुन लेगा और जीत जाएगा। यदि कोई तत्काल विजेता चाल नहीं है, तो यह देखने के लिए जांच करेगा कि क्या प्रतिद्वंद्वी उसी पद्धति का उपयोग करके जीत सकता है। यदि वे कर सकते हैं, तो यह उनके जीतने वाले वर्ग को ले जाएगा। यदि न तो कोई जीत है और न ही अवरुद्ध कदम उपलब्ध है, यह एक कोने में चला जाएगा। यह एक मूर्ख साथी को रोकता है:
- - -
- X -
- - -
- O - # Bad Move
- X -
- - -
- O X
- X -
- - -
- O X
- X -
O - -
- O X
- X -
O - X
यदि इनमें से कोई भी स्थिति नहीं होती है, तो यह मनमाने ढंग से एक वर्ग का चयन करेगा। फ़ंक्शन एल्गोरिथ्म द्वारा चुने गए 0 अनुक्रमित वर्ग का प्रतिनिधित्व करते हुए एक नंबर [0,8] आउटपुट करता है।
संपादित करें: एल्गोरिथ्म अब विकर्ण पर केंद्र को प्राथमिकता देता है, जो l4m2 और संबंधित रणनीतियों द्वारा इंगित किए गए एक अन्य मूर्ख साथी की संभावना को रोक देगा।
संपादित करें: स्पष्ट करने के लिए, फ़ंक्शन एक सरणी के रूप में एक बोर्ड में ले जाता है और एक कदम के रूप में एक कदम को आउटपुट करता है [0,8]। क्योंकि यह I / O रणनीति इतनी क्लिंकी है, यहां एक रैपर स्क्रिप्ट है जो इसे अधिक इंटरैक्टिव बनाती है। यह एक एकल कमांड लाइन तर्क लेता है, जो 1 होना चाहिए अगर खिलाड़ी पहले जाता है, और 0 यदि कार्यक्रम पहले जाता है।
import sys
def f(b):
t=4,9,2,3,5,7,8,1,6;n=lambda k:[t[i]for i,j in enumerate(b)if j==k];p,o,a,I=n(2),n(1),n(0),t.index
for i in p:
for j in p:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in o:
for j in o:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in 9,3,7,1:
if i in a and 5 in p:return I(i)
for i in 5,4,2,8,6:
if i in a:return I(i)
return I(a[0])
board = [0,0,0,0,0,0,0,0,0]
rep = {0:"-",1:"X",2:"O"}
turn = int(sys.argv[1])
while True:
for i in range(3):
print rep[board[i*3]]+" "+rep[board[i*3+1]]+" "+rep[board[i*3+2]]
print
if turn:
move = int(raw_input("Enter Move [0-8]: "))
else:
move = f(board)
board[move] = turn+1
turn = (turn+1)%2
we can assume that all previous moves of the 2nd player were also played by our engine