Mu Torere का एक आदर्श खेल खेलते हैं


14

पृष्ठभूमि

म्यू टॉरे एक ऐसा खेल है जो यूरोपीय प्रभाव से पहले न्यूजीलैंड के माओरी लोगों द्वारा खेले जाने वाले केवल दो में से एक है। यह इसे एक बहुत ही अनोखा खेल बनाता है कि इसमें "उद्देश्य जीतने की कसौटी" है और खेलने के नियम जो अस्तित्व के अधिकांश अन्य खेलों से अलग हैं।

गेमप्ले:

बोर्ड एक अष्टकोणीय है। प्रत्येक आसन्न शीर्ष के बीच संबंध हैं, और एक केंद्र नोड है जो सभी कोने से जुड़ा हुआ है। किसी भी समय, नौ में से आठ नोड्स पर पत्थरों का कब्जा होता है। प्रारंभ में, चार सफेद पत्थर और चार काले पत्थर हैं जो प्रत्येक अष्टकोण के आधे हिस्से को केंद्र नोड के साथ लेते हैं। काली पहले चलती है।

प्रत्येक मोड़ पर, एक खिलाड़ी अपने एक पत्थर को 16 किनारों में से एक नोड से एक खाली नोड में स्थानांतरित कर सकता है। एक पत्थर को केवल बाहरी नोड से केंद्र नोड में स्थानांतरित किया जा सकता है यदि पत्थर प्रतिद्वंद्वी के पत्थर के बगल में है।

एक खिलाड़ी तब हार जाता है जब वह एक कानूनी कदम उठाने में असमर्थ होता है, जो तब होता है जब कोई पत्थर खाली नोड को जोड़ने वाला कोई किनारे नहीं होता है।

नियमों का एक चित्र और स्पष्टीकरण

यहां एक वेबसाइट है जो नियमों को समझाती है (एक आरेख के साथ) और कुछ विश्लेषण प्रदान करती है।

चुनौती

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

सही खेल?

हाँ, सही खेल। मैं कुछ खेल विश्लेषण कर रहा हूं, और मैंने पाया कि खेल अनंत समय तक रहता है यदि दोनों पक्षों द्वारा पूरी तरह से खेला जाता है। इसका मतलब है कि आपके कार्यक्रम को कभी नहीं खोना चाहिए। इसके अलावा, आपका कार्यक्रम जब भी मानव प्रतिद्वंद्वी एक गलती करने की अनुमति देता है, तो इस कार्यक्रम को जीत के लिए मजबूर करने में सक्षम होना चाहिए। जैसे ही आपका प्रोग्राम सही चाल पाता है, यह आपके ऊपर है।

विवरण

प्रत्येक चाल के बाद (और खेल की शुरुआत में), आपके कार्यक्रम को गेम बोर्ड को प्रिंट करना चाहिए। हालाँकि, आप बोर्ड को प्रदर्शित करना चुनते हैं, यह सभी नोड्स को दिखाना होगा और पूरी तरह से जुड़ा होना चाहिए (सभी 16 कनेक्शन लाइनें बिना किसी पार किए बिना खींची जानी चाहिए)। शुरुआत में, बोर्ड के पास सही शुरुआती स्थिति होनी चाहिए। इसे पूरा करने का एक तरीका गेम बोर्ड को चौकोर बनाना है।

w-w-w
|\|/|
b-o-w
|/|\|
b-b-b

दो रंग काले और सफेद, या गहरे / हल्के हैं। बोर्ड को यह दिखाना चाहिए कि कौन से खिलाड़ी के टुकड़ों पर कब्ज़ा है, जैसे "b" या "w" के साथ उन्हें चिह्नित करना और कौन सा नोड खाली है। प्रतिभागियों को प्रोत्साहित किया जाता है (लेकिन आवश्यक नहीं) खेल बोर्ड को सादे पाठ के बजाय अधिक चित्रमय बनाने के लिए।

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

1-2-3
|\|/|
4-5-6
|/|\|
7-8-9

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

मान लें कि मानव हमेशा एक कानूनी कदम उठाएगा।

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

एक बार जीतने के बाद आपका कार्यक्रम समाप्त हो जाना चाहिए।

टिप्पणियाँ

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


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

1
मैंने आखिरी मिनट में उस आवश्यकता को फेंक दिया, और मुझे लगता है कि अगर हम इसे खत्म कर देते हैं तो यह ठीक होगा। यह सिर्फ मानव के लिए कठिन बनाता है, जो पहले से ही जीतने के लिए बर्बाद नहीं है। :)
PhiNotPi

1
यह मुश्किल नहीं है कि हमेशा एक कानूनी कदम दर्ज करें ... वैसे, काफी विस्तृत विश्लेषण के बाद मुझे लगता है कि आगे 1.5 चाल से अधिक खोज करना अनावश्यक है। चाहे वह दृष्टिकोण सबसे छोटा हो, एक और सवाल है।
पीटर टेलर

3
लिंक की गई वेबसाइट अब उपलब्ध नहीं है, इसे संग्रहित संस्करण के लिंक में बदलना बेहतर होगा।
टैली

जवाबों:


6

रूबी, 390 चरस

o=->s,c{f=s=~/o/;[*0..8].select{|t|s[t]==c&&(t<1||(t+6)%8+1==f||t%8+1==f||f<1&&(s[(t+6)%8+1]!=c||s[t%8+1]!=c))}.map{|t|k=s*1;k[f]=c;k[t]=?o;k}}
v=->s,c,h{f=o[s,c];f==[]?0:h<1?1:2-f.map{|t|v[t,c>?b??b:?w,h-1]}.min}
q=->g{puts"1-2-3\n|\\|/|\n8-0-4\n|/|\\|\n7-6-5\n".tr"0-8",g;$>.flush}
q[g="obbbbwwww"]
(g.tr!?o,?b;g[gets.to_i]=?o;q[g];q[g=o[g,?w].sort_by{|q|v[q,?w,5]}[-1]])while v[g,?b,5]>0

माणिक्य में एक कार्यान्वयन जो सीधे गेम ट्री (जो कुछ कोड लेता है) की गणना करता है और इस तरह हमेशा बेहतर तरीके से खेलता है। बोर्ड की स्थितियां बाहर की ओर दिखाई दे रही हैं जैसा कि निम्नलिखित आकृति में दिखाया गया है:

1 - 2 - 3
| \ | / |
8 - 0 - 4
| / | \ |
7 - 6 - 5

5

बैश और मित्र ( 463 447 वर्ण)

t(){ tr 0-8a-i $b$b
}
p(){ t<<E
0-1-2
|\|/|
3-4-5
|/|\|
6-7-8

E
}
g(){ b=`tr $x$e $e$x<<<012345678|t`
p
e=$x
}
b=bbbbowwww
e=4
m=0
p
while [ $m != 5 ]&&read x;do
g
m=0
for y in {0..8};do
s=0
S=05011234
grep -E "w.*($y$e|$e$y)"<<<${b:$y:1}30125876340142548746>/dev/null&&for p in wow.\*/ww wow.\*/w bbo.\*/b obb.\*/b www wbw .
do
((s++))
tr $y$e $e$y<<<3012587630/4e|t|grep $p>/dev/null&&break
done
s=${S:$s:1}
[ $s -gt $m ]&&m=$s x=$y
done
g
done

मानव के रूप में खेलता है b, कंप्यूटर के रूप में w। बोर्ड की स्थिति यहां शीर्ष पर स्थित डॉक्टर की है। यह पता चला है कि एक आदर्श खेल खेलने के लिए आश्चर्यजनक रूप से सरल हैं।

दूसरी ओर, दिलचस्प रास्ता खोना काफी कठिन है। http://ideone.com/sXJPy इस बॉट के खिलाफ सबसे कम संभव आत्महत्या को दर्शाता है। ध्यान दें कि अंत में अतिरिक्त 0 यह परीक्षण करना है कि यह लूप से सही तरीके से टूटता है।


नायब मैं एक पात्र को read xअनिवार्य करके बचा सकता था , लेकिन इससे परीक्षण काफी निराशाजनक होगा। मैं बोर्ड के बाद खाली लाइन को हटाकर एक चरित्र भी बचा सकता था, लेकिन ...
पीटर टेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.