आपका अगला कदम क्या है?


18

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

मिनिमैक्स एल्गोरिथम पर त्वरित पृष्ठभूमि

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

टिक-टैक-टो के संदर्भ में मिनी-मैक्स एल्गोरिथ्म के एक बेहतर, अधिक गहराई और प्रासंगिक सारांश के लिए, यहां अधिक पढ़ें: http://neverstopbuilding.com/minimax

XKCD (केवल 3x3 समाधान)

टिक-टैक-टो के 3x3 गेम के लिए सभी संभव कदम।

नियम

  • किसी भी भाषा का उपयोग किया जा सकता है, लेकिन किसी भी बाहरी न्यूनतम पुस्तकालयों की अनुमति नहीं है।
  • आउटपुट एक समन्वय (0-n, 0-n) या एक संख्या (1-n * n) सबसे अच्छा अगले कदम का संकेत हो सकता है।
    • इसके अलावा, आपको यह पहचानने में सक्षम होना चाहिए कि जीत के बजाय सबसे अच्छा मामला परिदृश्य एक नुकसान या एक टाई है।
    • जिस तरह से आप एक नुकसान या एक टाई को दर्शाते हैं, एक बार फिर, आपके ऊपर है।
  • इनपुट को पारंपरिक एक्स और ओ का उपयोग करना चाहिए, और आपको पहले एक्स चाल चलना चाहिए; रिक्त स्थानों को किसी भी चीज़ से दर्शाया जा सकता है।
  • आप मान सकते हैं कि आपके प्रोग्राम में आने वाले किसी भी इनपुट में n O's और n + 1 X है, दूसरे शब्दों में आप मान सकते हैं कि आपको एक अच्छी तरह से गठित बोर्ड मिल रहा है।
  • बोर्ड की वर्तमान स्थिति आपके कार्यक्रम का एकमात्र इनपुट होना चाहिए, यदि आप पुनरावृत्ति का उपयोग कर रहे हैं, तो इनपुट आवश्यकताओं को सुविधाजनक बनाने के लिए सहायक विधियाँ बनाई जानी चाहिए। स्पष्टीकरण के लिए /codegolf//a/92851/59376 देखें ।
  • 10> = n> = 1 के किसी भी मूल्य का समर्थन किया जाना चाहिए; यदि आपका प्रोग्राम n> 10 के लिए "टाइम आउट" है, तो मुझे यह स्वीकार्य लगता है, साथ ही कुछ भाषाओं में प्रसंस्करण शक्ति काफी कम है (विशेषकर वेब-फेसिंग कंसोल का उपयोग करके)।

आंकना

  • यह कोड-गोल्फ है, इसलिए कार्यक्रम की सबसे कम बाइट-गिनती जीतती है और मानक कमियां सार्वभौमिक रूप से अस्वीकृत हो जाती हैं।
  • एक टाई के मामले में, सबसे बड़ा 'एन' का समर्थन करने वाला कार्यक्रम जीत जाएगा।

उदाहरण इनपुट

2x2

[[X,O]
 [-,-]]

आउटपुट: 2 या [0,1] (3 या [1,1] भी यकीनन सही होगा) (स्थान के संकेत के कुछ रूप, जब तक आप आसानी से आपके द्वारा उपयोग किए गए प्रारूप को आसानी से समझा सकते हैं)


3x3

[[X,O,X]
 [O,X,-]
 [-,-,-]]

आउटपुट: -1 (हानि)


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


क्षमा करें, DJMCMayhem, मैंने वास्तव में उन चीजों को टैग करने की कोशिश की, लेकिन मैं यहां नया नहीं था।
मैजिक ऑक्टोपस उर्फ़

बोनस भी निकाल दिया, कुछ भी नहीं लेकिन टेडियम जोड़ा।
मैजिक ऑक्टोपस उर्फ़

क्या निम्न आउटपुट स्वरूप की अनुमति है: प्रत्येक मूल रूप से खाली स्थान पर बोर्ड की स्थिति का एक आरेख, जिसमें यह दर्शाया गया है कि यदि वहां खेल रहा है तो एक जीत / हानि / ड्रा (उदाहरण W, L और D)
टन Hospel

1
3x3 उदाहरण में, ओ को कोई फर्क नहीं पड़ता कि वह क्या खेलता है, लेकिन आपको कहना चाहिए कि आउटपुट [2,1] होना चाहिए, ऐसा क्यों है?
दादा

संपादित, अच्छी पकड़। पता नहीं मैं क्या सोच रहा था, यह नकारात्मक उदाहरण था।
मैजिक ऑक्टोपस उर्फ़

जवाबों:


8

पर्ल, 101 98 बाइट्स

के लिए शामिल +4है-0p

STDIN पर इनपुट के साथ चलाएँ

tictactoe.pl
OXO
---
--X
^D

आउटपुट एक ही आरेख है, लेकिन अपनी स्थिति के साथ अद्यतन किए गए प्रत्येक कदम के साथ, 1एक जीत का 2प्रतिनिधित्व करता है , एक ड्रॉ का 3प्रतिनिधित्व करता है और एक नुकसान का प्रतिनिधित्व करता है। इस मामले के लिए यह होगा

OXO
223
21X

इसलिए 3 चालें ड्रा, 1 जीत और 1 हार (मैं इस आउटपुट प्रारूप को अस्वीकार्य होने पर समाधान अपडेट करूंगा, लेकिन मूल कोड वही रहेगा)

tictactoe.pl:

#!/usr/bin/perl -0p
m%@{[map"O.{$_}"x"@-"."O|",1-/.(
)(.)/,@-]}Z%sx||s%-%$_="$`X$'";y/XO/OX/;do$0%eg?/1/?3:1+/2/:2

यह पहले से ही काफी धीमा है और खाली 3 * 3 बोर्ड के लिए बहुत सारी मेमोरी का उपयोग करता है (क्यों वास्तव में, पुनरावृत्ति उस गहरी नहीं जाती है। कुछ मेमोरी लीक होना चाहिए)। मेमोइज़िंग लागत 6 बाइट्स जोड़ना

#!/usr/bin/perl -0p
$$_||=m%@{[map"O.{$_}"x"@-"."O|",1-/.(\n)(.)/,@-]}Z%sx||s%-%$_="$`X$'";y/XO/OX/;do$0%eg?/1/?3:1+/2/:2

वाह, यह देखते हुए कि यह पीएल है और संभावना पूरी तरह से n = 10 के लिए नहीं चलेगी बहुत सारे खालीपन के साथ ... आपने उन दोनों चीजों को किया जो मैं किसी को देखने की उम्मीद कर रहा था। एक स्ट्रिंग इनपुट और सभी चालों के लिए परिणाम को मैप करना, न केवल सबसे अच्छा। वाहवाही।
मैजिक ऑक्टोपस Urn

यदि एक पुनरावर्ती कार्य 'रिसाव' कैसे ठीक हो सकता है ??? बहुत उच्च भाषा सीपीयू में 32 बिट रजिस्टर (या साधारण निर्देश के रूप में कुछ) को नहीं
देखती है

इस संदर्भ में @RLLup लीक का मतलब यह नहीं है कि अप्राप्य खोई हुई स्मृति। पर्ल मेमोरी में अजीबोगरीब है, जब यह मेमोरी रिलीज़ करता है, तो अक्सर ऐसा करने की अपेक्षा आप बाद में करते हैं और इसलिए आप अपेक्षा से बहुत अधिक मेमोरी का उपयोग करते हैं। यह इस अपेक्षा में सीधे ज़रूरत से ज़्यादा आवंटित करने के लिए जाता है कि आप अपने डेटास्ट्रक्चर को बढ़ाएंगे। इस मामले में "सामान्य" पुनरावृत्ति का उपयोग करने के बजाय एक समारोह के दुरुपयोग के साथ do$010 गुना कम मेमोरी का उपयोग किया जाएगा। ध्यान रहे, यह मामला इतना चरम है कि यह वास्तव में एक वास्तविक मेमोरी लीक हो सकता है।
टन हास्पेल

न केवल रजिस्टरों या आधार निर्देशों (hlls निर्देशों से) को न देखें, लेकिन स्मृति उपयोग का नियंत्रण खो दें ... मेरे लिए वे स्केल नहीं करते ...
RosLuP

यह काफी लंबा हो गया है, आप मेरे आदमी को जीतें, दुख की बात है कि हमें अधिक प्रयास नहीं मिले।
मैजिक ऑक्टोपस Urn

2

जावास्क्रिप्ट (ईएस 6), 320 294 बाइट्स

(b,p,d,M,S=-2)=>(T=(p,q,r,s)=>b[p][q]==(n=b[r][s|0])&&n!='-',w=0,b.map((r,y)=>(l=r.length-1,m=15,r.map((c,x)=>(m&=8*T(l-x,x,l)+4*T(x,x,0)+2*T(x,y,0,y)+T(y,x,y))),w|=m)),w?-1:(b.map((r,y)=>r.map((c,x)=>S<1&&c=='-'&&(r[x]='O.X'[p+1],(s=-f(b,-p,1))>S&&(S=s,M=[x,y]),r[x]=c))),S=S+2?S:0,d?S:[M,S]))

इनपुट

1) वर्तमान बोर्ड का वर्णन करने वाले वर्णों की एक सरणी, जैसे:

[['X', '-'], ['-', 'O']]

2) वर्तमान पूर्णांक का वर्णन करने वाला पूर्णांक: 1 = X, -1 =O

उत्पादन

एक सरणी:

  • एक सरणी जो [x, y]प्रारूप में सबसे अच्छी चाल का वर्णन करती है
  • पूर्णांक के रूप में खेल का परिणाम: 1 = जीत, -1 = नुकसान, 0 = टाई

उदाहरण

निम्नलिखित उदाहरण में, Xखेलने के द्वारा जीतने की गारंटी है [1, 2]

let f =
(b,p,d,M,S=-2)=>(T=(p,q,r,s)=>b[p][q]==(n=b[r][s|0])&&n!='-',w=0,b.map((r,y)=>(l=r.length-1,m=15,r.map((c,x)=>(m&=8*T(l-x,x,l)+4*T(x,x,0)+2*T(x,y,0,y)+T(y,x,y))),w|=m)),w?-1:(b.map((r,y)=>r.map((c,x)=>S<1&&c=='-'&&(r[x]='O.X'[p+1],(s=-f(b,-p,1))>S&&(S=s,M=[x,y]),r[x]=c))),S=S+2?S:0,d?S:[M,S]))

console.log(JSON.stringify(f(
  [['O','X','O'],
   ['-','-','-'],
   ['-','-','X']],
  1
)));

एक मजबूत खेल। केवल जीतने के लिए खेलते नहीं है।
चेस के एक अच्छे खेल के बारे में कैसे?


अच्छा किया, अच्छी पहली प्रविष्टि। केवल टिप्पणी में मेरे पास बाइट्स को बचाने के लिए दी गई जानकारी है 'X हमेशा आगे बढ़ेगा'। और क्या आपने एक गैर 3x3 बोर्ड के साथ कोशिश की है?)
मैजिक ऑक्टोपस Urn

@ कोरसोकोम्पुटिंग - 'एक्स हमेशा हमेशा आगे बढ़ेगा' के साथ आपके मन में क्या है, इसे समझना निश्चित नहीं है। इसका उपयोग यह करने के लिए किया जा सकता है कि बोर्ड को दिए गए कदम पर कौन सा पक्ष है, लेकिन कंप्यूटिंग में वास्तव में अधिक बाइट खर्च होंगे; इसलिए मुझे लगता है कि आप कुछ और बात कर रहे हैं। उत्तर हाँ, मैंने थोड़े बड़े बोर्डों के साथ कुछ परीक्षण किए। जब तक उम्मीद की जानी चाहिए ... तब तक काम करना चाहिए ... बहुत सारे खाली स्थान नहीं हैं। :-)
अरनौल

चुनौती कहती है The current state of the board must be the only input to your program। आपके कोड को दो इनपुट चाहिए, जो इस नियम को तोड़ते हैं।
दादा

1
@Dada - मैं इस बारे में सोच रहा था, लेकिन मैं मान लिया सक्रिय रंग है बोर्ड के राज्य का हिस्सा (सिर्फ एक शतरंज स्थिति की तरह हमेशा सक्रिय रंग + अंपैसां वर्ग + कैसलिंग उपलब्धता के साथ आता है)। इसलिए मुझे लगता है कि ओपी को उस बिंदु को स्पष्ट करना चाहिए। (और अगर आप सही कह रहे हैं, तो यह एक अनावश्यक अतिरिक्त कठिनाई की तरह लग रहा है, IMHO।)
अरनुल्लड

1
मम्म .. मुझे वास्तव में उनकी प्रतिक्रिया में बोर्ड राज्य की व्याख्या पसंद है। इस पर विचार करते हुए, कुछ लाॅन्गेज केवल इनपुट के रूप में स्ट्रिंग्स का उपयोग कर सकते हैं, एक बोर्ड जैसे कि XXOOXO-OO बोर्ड आयामों की तरह अतिरिक्त जानकारी के बिना कम बाइट काउंट में डिक्रिप्ट करना मुश्किल होगा। बीमार किसी भी अतिरिक्त इनपुट की अनुमति देता है जो बोर्ड राज्य में योगदान देता है, हालांकि मुझे अभी भी लगता है कि सूचना 'मान लें कि एक्स चाल पहले' 'दिए गए व्हाट्स टर्न इट' से अलग है। कुछ भाषाएं एक धारणा के रूप में इसका लाभ उठाएंगी;)
मैजिक ऑक्टोपस Urn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.