अलक का सबसे छोटा खेल लिखो


10

अलक का आविष्कार गणितज्ञ एके डेवडनी द्वारा किया गया था, और उनकी 1984 की पुस्तक प्लानवर्स में वर्णित है। अलक के नियम सरल हैं:

अलक एक दो-खिलाड़ी खेल है, जो एक आयामी बोर्ड पर ग्यारह स्लॉट के साथ खेला जाता है। प्रत्येक स्लॉट एक समय में अधिकतम एक टुकड़ा पकड़ सकता है। दो प्रकार के टुकड़े हैं, "x" और "ओ"। x का संबंध एक खिलाड़ी से है, दूसरे का o है। बोर्ड का प्रारंभिक विन्यास है:

      xxxx___oooo

खिलाड़ी आगे बढ़ते हैं। प्रत्येक मोड़ पर, प्रत्येक खिलाड़ी एक बार केवल एक टुकड़ा ले जा सकता है। एक खिलाड़ी अपनी बारी पर पास नहीं हो सकता। एक खिलाड़ी अपने किसी भी एक टुकड़े को अगले निर्बाध स्लॉट में उसके दाईं या बाईं ओर ले जा सकता है, जिसमें कब्जे वाले स्लॉट पर कूदना शामिल हो सकता है। एक खिलाड़ी बोर्ड की तरफ से एक टुकड़ा नहीं हिला सकता है।

यदि एक चाल एक ऐसा पैटर्न बनाती है जहां प्रतिद्वंद्वी के टुकड़े घिरे होते हैं, दोनों तरफ, मोवर के रंग के दो टुकड़ों (बिना किसी खाली किए हुए खाली स्लॉट के साथ) से, तो उन घिरे टुकड़ों को बोर्ड से हटा दिया जाता है।

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

मैंने इस गेम को ऑनलाइन पाया और सोच रहा था: क्या इसे गोल्फ किया जा सकता है?

गोल्फ के नियम

  • आपके कोड को गेम में सभी नियमों का पालन करना चाहिए, कैप्चर को संभालना, उचित चलना आदि (केवल अपवाद है कि आपको बॉट नहीं जोड़ना है, लेकिन आपके पास दोनों खिलाड़ियों को किसी तरह नियंत्रित करना होगा, और एक खिलाड़ी को मानव होना चाहिए)।
  • इनपुट को टाइल X से टाइल Y तक ले जाना चाहिए, या छोड़ना चाहिए। उदाहरण के लिए, आप यह 1 4कह सकते हैं कि 'इस टुकड़े को टाइल 1 से टाइल 4 पर ले जाएँ'। quitकार्यक्रम को समाप्त करेगा, हालांकि उपयोग करना Control- Cस्वीकार्य होगा। आपको यह भी जांचना होगा कि क्या कोई चाल अमान्य है (बोर्ड के बाहर जाकर या कहीं और ले जाने के लिए जिसे आपको एक खाली जगह पर पार करना होगा या संदेश भेजने के लिए या टाइलों की एक जोड़ी नहीं है quit)।
  • विजेता खिलाड़ियों और अवैध के लिए आउटपुट होना चाहिए P1 WINS, P2 WINSऔर INVALIDक्रमश:। (ये सभी 7 वर्ण हैं।)
  • आउटपुट बोर्ड को दिखाना होगा। बस इतना ही चाहिए।
  • इससे कोई फर्क नहीं पड़ता कि आप किसी भी सहायता प्राप्त संख्या जैसे टाइल या अन्य टुकड़ों का उपयोग करते हैं।
  • चुनौती समाप्त होती है यदि:

    • एक जवाब में 50 वोट मिलते हैं
    • एक उत्तर 3 सप्ताह के लिए शीर्ष-मतदान रहता है, और उस समय कोई अन्य उत्तर पोस्ट नहीं किया गया था

और चुनौती के कम से कम 3 उत्तर हैं (इसलिए कुछ वास्तविक प्रतियोगिता है)।

खेल के नियम

  • बाईं ओर का खिलाड़ी पहले शुरू होना चाहिए।
  • एक समय में केवल एक टुकड़ा एक वर्ग में रहता है। आप टुकड़े को बाएं या दाएं तब तक घुमाते हैं जब तक कि वह एक खाली जगह को न मार दे। बोर्ड लपेटता नहीं है, और आप निर्जन क्षेत्रों में नहीं जा सकते। उदाहरण के लिए:
    • xoo__o। यहाँ, xसही चलने से बोर्ड बदल जाएगा _oox_o
    • xxooo_। यहां, सबसे दूर-बाएं xउपज के लिए स्थानांतरित हो सकता है _xooox, जो कि oएस को पकड़ लेता है , छोड़कर _x___x
    • x__oox। यहां, os पर कब्जा नहीं किया गया है (अभी भी एक अंतर है)। कैप्चर करना संभव नहीं है, क्योंकि आप खाली जगहों से नहीं जा सकते। xबाईं तरफ केवल एक अंतरिक्ष चला जाता, क्योंकि वहाँ के बीच में कोई अन्य टुकड़े कर रहे हैं (छोड़ने _x_oox)।
  • यदि समूह प्रतिद्वंद्वी के टुकड़ों से घिरा हो तो एक साथ कई आसन्न टुकड़ों को पकड़ा जा सकता है। उदाहरण के x_ooxलिए _xoox, दोनों पर कब्जा करेगा oऔर परिणाम देगा _x__x
  • यदि एक कदम के बाद, आप पहले प्रतिद्वंद्वी के टुकड़ों को पकड़ते हैं, तो यह जांचने से पहले कि क्या आपका अपना टुकड़ा हटा दिया जाना चाहिए। दो उदाहरण लें:
    • o_oxxको oxox_। पहले, दूसरे oपर कब्जा कर लिया जाता है ox_x_, इसलिए xबोर्ड पर पहला अवशेष रहता है।
    • o_ooxको oxoo_। इस बार, इनमें से कोई भी oकब्जा नहीं किया गया xहै , इसलिए इसके बजाय कब्जा कर लिया गया है।
    • यदि आपके पास केवल एक टुकड़ा है, तो खेल समाप्त हो जाता है, क्योंकि आप सिर्फ एक टुकड़े के साथ कब्जा नहीं कर सकते।

खेल शुरू किया जाय! मैं आपके साथ आने के लिए उत्सुक हूं।


टिप्पणियाँ पुरानी हो गईं, क्योंकि वे अप्रचलित थीं। कृपया मुझे ऐसी किसी भी टिप्पणी से अवगत कराएं, जिसे अनवील किया जाना चाहिए।
दरवाज़े

जवाबों:


9

सी, 617 592 बाइट्स

#define O(x)(x-'x'?'x':'o')
q,f,t,k,i,x=4,o=4,*d;main(){char*A,Q[9],c='x',b[]="xxxx___oooo";printf(b);while(!q){scanf(" %8[^\n]%*[^\n]",Q);if(!strcmp(Q,"quit"))break;f=*Q>47&&*Q<58?atoi(Q):-1;A=f>9?Q+2:Q+1;t=*A==32&&A[1]>47&&A[1]<58?atoi(A+1):-1;i=t==f&&t<0&&f<0?1:0;for(k=f;k!=t;k+=(t-f)/abs(t-f))if(b[k]==95||b[t]-95||b[f]-c)i=1;if(i){printf("INVALID");continue;}b[t]=c;b[f]=95;for(t=0;t<2;t++){d=c-'x'?&o:&x;for(k=1;k<11;k++)if(b[k]==O(c)){for(i=k+1;b[i]==O(c)&&b[i];i++);if(b[i]==c&&b[k-1]==c)while(k<i)b[k++]=95,(*d)--;}c=t?c:O(c);}printf(b);if(o<2||x<2)printf("P%d WINS",(x>1)+1),q=1;}}

सुलझाया:

#define O(x)(x-'x'?'x':'o')
q,f,t,k,i,x=4,o=4,*d;
main(){
    char*A,Q[9],c='x',b[]="xxxx___oooo";
    printf(b);
    while(!q){
        scanf(" %8[^\n]%*[^\n]",Q);
        if(!strcmp(Q,"quit"))break;
        f=*Q>47&&*Q<58?atoi(Q):-1;
        A=f>9?Q+2:Q+1;
        t=*A==32&&A[1]>47&&A[1]<58?atoi(A+1):-1;
        i=t==f&&t<0&&f<0?1:0;
        for(k=f;k!=t;k+=(t-f)/abs(t-f))
            if(b[k]==95||b[t]-95||b[f]-c)
                i=1;
        if(i){
            printf("INVALID");
            continue;
        }
        b[t]=c;
        b[f]=95;
        for(t=0;t<2;t++){
            d=c-'x'?&o:&x;
            for(k=1;k<11;k++)
                if(b[k]==O(c)){
                    for(i=k+1;b[i]==O(c)&&b[i];i++);
                    if(b[i]==c&&b[k-1]==c)
                        while(k<i)b[k++]=95,(*d)--;
                }
            c=t?c:O(c);
        }
        printf(b);
        if(o<2||x<2)printf("P%d WINS",(x>1)+1),q=1;
    }
}

मैं वास्तव में ~ 400 बाइट्स में यह एक प्राप्त करना चाहता था, लेकिन यहां बहुत कम नियम हैं और इनपुट प्रसंस्करण बहुत अप्रिय है। मैं निश्चित रूप से इसके साथ नहीं किया गया हूँ। यहाँ नमूना रन का एक सेट है जो बस के बारे में सब कुछ शामिल है:

xxxx___oooo0 4
_xxxx__oooo7 6
_xxxx_o_ooo4 5
_xxx_xo_ooo8 6
INVALID8 7
_xxx_xoo_oo3 4
_xx_xxoo_oo7 3
_xxo__o__oo1 4
__x_x_o__oo10 9
INVALID10 8
__x_x_o_oo_2 3
___xx_o_oo_6 5
___xxo__oo_6 6
INVALID5 5
INVALID3 6
____x_x_oo_8 7
____x_xo_o_6 8
____x__o_o_P2 WINS

xxxx___oooo0 4
_xxxx__oooo10 6
_xxxx_oooo_1 5
__xxxxoooo_9 1
_o____ooo__P2 WINS

xxxx___oooo0 4
_xxxx__oooo7 6
_xxxx_o_ooo1 5
__xxxxo_ooo10 7
__xxxxoooo_2 10
___xxx____xP1 WINS

xxxx___oooo3 4
xxx_x__ooooquits
INVALIDtestme
INVALID3*4
INVALID3 four
INVALIDthree four
INVALIDthisstringislongerthanmybuffer
INVALID10 0
INVALID4 5
INVALID7 6
xxx_x_o_oooquit

अगर मैंने कुछ गलत समझा है, तो कृपया मुझे बताएं!


मैंने इसका परीक्षण किया, यह अच्छी तरह से काम करता है, और कुछ भी नहीं छोड़ा गया था। बहुत बढ़िया!
ASCIIThenANSI

आप की जगह में कुछ बाइट्स बचा सकता है printf("INVALID");के साथ puts("INVALID");, o<2||x<2के साथ o<2|x<2और printf(b);while(!q){साथfor(printf(b);!q;){
es1024

3

PHP - 505

<?php
$s="xxxx___ooo".$y=o;$x=x;$c=function($m)use(&$x){return$x.str_repeat('_',strlen($m[1])).$x;};$e='$s=preg_replace_callback("~$x($y+)$x~",$c,$s);';$_=substr_count;while(true){echo$s;if($_($s,x)<2)die("P2 WINS");if($_($s,o)<2)die("P1 WINS");$i=trim(fgets(STDIN));if($i=='quit')die;if(!preg_match('!^(\d+) (\d+)$!',$i,$m)||$s[$f=$m[1]]!=$x||$s[$t=$m[2]]!="_"||(0&($a=min($f,$t))&$b=max($f,$t))||$_($s,"_",$a,($b-$a)+1)>1)echo"INVALID\n";else{$s[$f]='_';$s[$t]=$x;eval($e);$z=$x;$x=$y;$y=$z;eval($e);}}

नोटिस पुनः निर्देशित द्वारा दबा दिया जाना चाहिए STDERRकरने के लिए /dev/null

साने व्हाट्सएप के साथ:

<?php
@$s = "xxxx___ooo".($y = o);
@$x = x;
$c = function($m)usea(&$x){
    return$x.str_repeat('_',strlen($m[1])).$x;
};
$e = '$s=preg_replace_callback("~$x($y+)$x~",$c,$s);';
@$_ = substr_count;
while (true){
    echo $s;

    if (@$_($s,x) < 2) die("P2 WINS");
    if (@$_($s,o) < 2) die("P1 WINS");

    $i = trim(fgets(STDIN));
    if($i == 'quit') die;

    if( !preg_match('!^(\d+) (\d+)$!',$i,$m)
    ||   $s[$f = $m[1]] != $x
    ||  @$s[$t = $m[2]] != "_"
    ||  (0 & ($a = min($f, $t)) & $b = max($f, $t))
    ||  $_($s, "_", $a, ($b - $a) + 1) > 1
    ) echo "INVALID\n";
    else {
        $s[$f] = '_';
        $s[$t] = $x;
        eval($e);
        $z = $x;
        $x = $y;
        $y = $z;
        eval($e);
    }
}

BrainSteel के परीक्षण मामलों के साथ:

xxxx___oooo0 4
_xxxx__oooo7 6
_xxxx_o_ooo4 5
_xxx_xo_ooo8 6
INVALID
_xxx_xo_ooo8 7
_xxx_xoo_oo3 4
_xx_xxoo_oo7 3
_xxo__o__oo1 4
__x_x_o__oo10 9
INVALID
__x_x_o__oo10 8
__x_x_o_oo_2 3
___xx_o_oo_6 5
___xxo__oo_6 6
INVALID
___xxo__oo_5 5
INVALID
___xxo__oo_3 6
____x_x_oo_8 7
____x_xo_o_6 8
____x__o_o_P2 WINS

xxxx___oooo0 4
_xxxx__oooo10 6
_xxxx_oooo_1 5
__xxxxoooo_9 1
_o____ooo__P2 WINS

xxxx___oooo0 4
_xxxx__oooo7 6
_xxxx_o_ooo1 5
__xxxxo_ooo10 7
__xxxxoooo_2 10
___xxx____xP1 WINS

xxxx___oooo3 4
xxx_x__ooooquits
INVALID
xxx_x__ooootestme
INVALID
xxx_x__oooo3*4
INVALID
xxx_x__oooo3 four
INVALID
xxx_x__oooothree four
INVALID
xxx_x__oooothisstringislongerthanmybuffer
INVALID
xxx_x__oooo10 0
INVALID
xxx_x__oooo4 5
INVALID
xxx_x__oooo7 6
xxx_x_o_oooquit

Ices नोटिस / चेतावनियों ’से आपका क्या तात्पर्य है?
ASCIIThenANSI

@ASCIIThenANSI चेतावनियों के कारण अनियंत्रित वर्ण शाब्दिक: PHP सूचना: अनिर्धारित निरंतर ओ का उपयोग / मान लिया गया 'ओ' पर /tmp/pcg-48388.php 2 पंक्ति में। कोई उन्हें / देव / अशक्त पर पुनर्निर्देशित कर सकता है।
तिमौला

क्या इससे कार्यक्रम टूट जाता है?
ASCIIThenANSI

@ASCIIThenANSI नहीं, यह ठीक काम करता है कि वे पुनर्निर्देशित हैं /dev/null
तिमुल्ला

तब तक यह ठीक है जब तक कि कार्यक्रम ठीक से काम करना जारी रखता है, और उन्हें पुनर्निर्देशित किया जाता है /dev/null
ASCIIThenANSI

1

पायथन 2, 536 509 448 441 बाइट्स

के माध्यम से बुलाओ a(); मूव्स को फॉर्म piece,destination(यानी 1,4) में दर्ज किया जाना है ; Ctrl-C के साथ छोड़ दें। अगर कोई और अधिक गोल्फिंग क्षमता देख सकता है, तो मैं सभी कानों के पास हूं।

b,r,x='_',lambda p:''.join([p[i]for i in x]),range(11)
def a(m='xo'):
 t=w=0;p=dict(zip(x,'xxxx___oooo'))
 while w<1:
    print r(p);y=m[t%2]
    try:
     s,v=input();1/all([y==p[s],{v}<{r(p).rfind(b,0,s),r(p).find(b,s)},v-s]);p[s],p[v],h,c=b,y,0,{}  
     for _ in y,m[-~t%2]:
        for i in p:exec{_:"h=1;p.update(c)",b:"h,c=0,{}"}.get(p[i],h*"c[i]=b")
     w=min(map(r(p).count,m))<2;t+=1
    except:print"INVALID"
 print"P%d WINS"%-~(r(p).count('o')<2)

1

SpecBAS - 718 बाइट्स

SpecBAS Sinclair / ZX BASIC का एक अपडेटेड वर्जन है जो एमुलेटर के बाहर चल सकता है। (फिर भी व्याख्या की गई)।

आकार को नीचे लाने के लिए कुछ नई विशेषताओं का उपयोग किया है जितना मैं कर सकता था।

पंक्ति 12, इनलाइन का उपयोग करके "सैंडविच" टुकड़ों की खोज करने के लिए एक रेगेक्स सेट करता है यदि IF और लाइन 18, INC की प्रकृति के चारों ओर रैप का उपयोग करता है (कहने के बजाय INC p: IF p=3 THEN LET p=1)

1 LET b$="xxxx---oooo": LET p=1: LET c$="xo": DIM s=4,4
2 LET v=0: PRINT b$'"[";p;"] ";
3 INPUT m$: IF m$(1)="Q" THEN PRINT "QUIT": STOP 
4 LET f=VAL(ITEM$(m$,1," ")): LET t=VAL(ITEM$(m$,2," ")): PRINT f;" ";t
5 IF (f<1 OR f>11) OR (t<1 OR t>11) THEN LET v=1: GO TO 10
6 IF (b$(f)<>c$(p)) OR b$(t)<>"-" THEN LET v=1: GO TO 10
7 FOR i=f TO t STEP SGN(t-f)
8 IF b$(i)="-" THEN IF i<>t THEN LET v=1
9 NEXT i
10 IF v=1 THEN PRINT "INVALID": GO TO 2
11 LET b$(t)=b$(f): LET b$(f)="-"
12 LET r$=IIF$(p=1,"xo+x","ox+o")
13 LET m=MATCH(r$,b$): IF m=0 THEN GO TO 18
14 FOR i=m+1 TO POS(c$(p),b$,m+2)
15 IF b$(i)=c$(3-p) THEN LET b$(i)="-": DEC s(3-p): END IF
16 NEXT i
17 IF s(3-p)<2 THEN PRINT b$'"P";p;" WINS": STOP 
18 INC p,1 TO 2
19 GO TO 2

आउटपुट (आउटपुट विधवा से कॉपी नहीं कर सकता, इसलिए स्क्रीन शॉट) यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


0

सी #, 730 बाइट्स

using System;using System.Linq;class P{static void Main(string[]z){int p=1,d,e,g,x,y;var b=new[]{3,1,1,1,1,0,0,0,2,2,2,2};var o=new[]{"_","x","o"};Action<string>h=s=>{Console.Write(s,p);Environment.Exit(0);};Action i=()=>h("INVALID");Func<int,int,bool>j=(q,r)=>b.Select((v,w)=>w<=q||w>=r||v>0?0:w).Any(w=>w>0);Action<int>k=m=>{e=0;for(d=1;d<12;d++){if(b[d]==m){if(e>0&&!j(e,d))for(g=e+1;g<d;g++)b[g]=0;e=d;}}if(b.Count(w=>w>0&&w!=m)<3)h("P{0} WINS");};try{for(;;){for(g=1;g<12;g++)Console.Write(o[b[g]]);var n=Console.ReadLine();if(n=="quit")h("");var c=n.Split(' ');x=int.Parse(c[0]);y=int.Parse(c[1]);if(c.Length>2||b[x]!=p||b[y]!=0||(p>1?y:x)>=(p>1?x:y)||j(x<y?x:y,x<y?y:x))i();b[x]=0;b[y]=p;k(p);p=p>1?1:2;k(p);}}catch{i();}}}

मैं कल्पना करता हूं कि इसमें और सुधार संभव है। दूसरी ओर, मैंने INVALIDआउटपुट को अंतिम निष्पादन के रूप में व्याख्यायित किया , इसलिए मुझे उस मुद्दे को अन्य उत्तरों के साथ समानता में रखने की आवश्यकता हो सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.