आदेश और अराजकता और कोडगॉल्फ


10

ऑर्डर और कैओस 6x6 बोर्ड पर खेला जाने वाला टिक-टैक-टो का एक प्रकार है। हालाँकि, खेल को अद्वितीय बनाता है, दोनों खिलाड़ियों को एक एक्स या ओ रख सकते हैं! प्रत्येक मोड़ (ऑर्डर से शुरू), एक खिलाड़ी किसी भी खाली वर्ग में एक एक्स या ओ रखता है।
जीतना सरल है। यदि बोर्ड पर एक पंक्ति में 5 Xs या Os (लंबवत, क्षैतिज या तिरछे) हों तो ऑर्डर जीत जाता है। यदि बोर्ड भर जाता है तो अराजकता जीत जाती है और बोर्ड पर 5 एक्स या ओएस के कोई तार नहीं होते हैं। आपका काम? खैर, क्योंकि यह प्रोग्रामिंग पहेलियाँ और कोड गोल्फ है, तो आप गेम को प्रोग्राम करने जा रहे हैं, और इसे गोल्फ।

नियम

  • आप इनपुट को स्वीकार करना चाहिए के रूप में x y tहै, जहां xऔर yनिर्देशांक हैं, और tटाइल प्रकार (है Xया O)। निर्देशांक 0 0ऊपरी-बाएं कोने से शुरू होते हैं और 5 5(निचले-दाएं कोने) तक बढ़ते हैं ।
  • यदि उपयोगकर्ता अमान्य निर्देशांक, टाइल, किसी भी इनपुट के रूप में नहीं आता है , या जहां पहले से ही एक है, वहां एक टाइल लगाने की कोशिश करता है, तो आपको qछोड़ना और प्रिंट करना स्वीकार करना चाहिए । (केवल अपवाद है , क्योंकि यह कार्यक्रम को पूरा करता है।)INVALIDx y tq
  • यदि ऑर्डर जीतता है, तो आप आउटपुट करेंगे P1 WINS। यदि कैओस जीत जाता है, तो आप आउटपुट करेंगे P2 WINS
  • आदेश पहले जाना चाहिए।
  • रिक्त स्थान का प्रतिनिधित्व किया जाता है .
  • टाइलें हैं Xऔर O(अपरकेस)। आपको लोअरकेस स्वीकार करने की आवश्यकता नहीं है, लेकिन अपरकेस की आवश्यकता है।
  • आपके बोर्ड में केवल शामिल होना चाहिए .XO
  • आप वास्तव में खेल खेलने वाले दोनों खिलाड़ियों का अनुकरण कर रहे हैं, एक बोर्ड नहीं दिया जा रहा है और कौन जीतता है इसकी जाँच कर रहा है। यह एक चाल को इनपुट के रूप में स्वीकार करता है, फिर बोर्ड को प्रिंट करता है, एक अन्य चाल को स्वीकार करता है, और इसी तरह, जब तक कि एक खिलाड़ी जीत नहीं जाता।

शुरुआती बोर्ड इस तरह दिखता है:

......
...... 
......
......
......
...... 

और पहले खिलाड़ी (ऑर्डर) इनपुट्स के बाद 1 2 X, इसे इस तरह दिखना चाहिए:

......
...... 
.X....
......
......
......  

इसी तरह, जब अगले खिलाड़ी (कैओस) इनपुट्स 3 3 O, यह इस तरह दिखेगा:

......
...... 
.X....
...O..
......
......  

और यह तब तक जारी रहता है जब तक कि एक खिलाड़ी जीत नहीं जाता।

हमेशा की तरह, स्टैण्डर्ड कमियां जो हर चीज से मजा लेती हैं, वर्जित हैं।

विजेता 15 जून, 00:00 UTC के सबसे छोटे कोड वाला है (जब यह चुनौती पोस्ट की गई थी, तब से लगभग एक महीना था।)


क्या होगा यदि कोई खिलाड़ी पहले से ली गई स्थिति में टाइप करता है?
लोवोजो

@Lovjo यह लौटाता है INVALID। मैंने उसे अभी संपादित किया है, धन्यवाद।
ASCIIThenANSI

1
एक पंक्ति में 5 टाइल्स का पता चलने पर खेल से बाहर निकलना चाहिए?
काइल कानोस

1
हो सकता है कि मैंने इसे अनदेखा कर दिया हो, लेकिन क्या बोर्ड को स्क्रीन पर प्रिंट करना है या सिर्फ बोर्ड की स्थिति और आउटपुट की जांच करना है कि कौन सा खिलाड़ी जीतता है?
कोदोस जॉनसन

@ और मुझे वास्तव में खेल का अनुकरण करना था। आप प्रत्येक खिलाड़ी के इनपुट को स्वीकार करते हैं, एक बार में एक बारी, और फिर जांचें कि क्या खिलाड़ी ने प्रत्येक मोड़ जीता है। क्या विवरण अस्पष्ट है?
ASCIIThenANSI

जवाबों:


1

PHP, 316

यहाँ मेरा सबमिशन है। इसे कमांड लाइन में php द्वारा निष्पादित किया जाना है।

ध्यान दें कि यह कोड मेरे द्वारा किए गए कुछ शॉर्टकट के कारण नोटिस तैयार करता है। मुझे बताएं कि क्या यह ठीक है। मैं इसे कुछ और पात्रों को जोड़कर ठीक कर सकता हूं। मैंने इस पृष्ठ की जाँच की और शीर्ष उत्तर में कहा गया है कि यदि इसके बारे में कोई उल्लेख नहीं है, तो त्रुटि रिपोर्टिंग बंद हो जाती है।

<?for(;$i++<6;)$b.='......|';while(($a=trim(fgets(STDIN)))!='q'){preg_match('/^([0-5]) ([0-5]) ([XO])$/',$a,$d)&($b[$c=$d[2]*7+$d[1]]=='.')?$b[$c]=$d[3]:print"INVALID\n";echo str_replace("|","\n",$b); foreach([0,5,6,7]as$e)preg_match('/(X|O)(.{'.$e.'}\1){4}/',$b)-1?:die("P1 Wins");strstr($b,'.')?'':die("P2 Wins");}

और यहाँ कोड का बिना गोल्फ वाला संस्करण है:

<?php
error_reporting(E_ALL & ~E_NOTICE);

for(;$i++<6;)$b.='......|';
while(($a=trim(fgets(STDIN)))!='q'){

    #Validate and assign 
    preg_match('/^([0-5]) ([0-5]) ([XO])$/',$a,$d)&($b[$c=$d[2]*7+$d[1]]=='.')?$b[$c]=$d[3]:print"INVALID\n";

    #Output
    echo str_replace("|","\n",$b); 

    #Check if Order wins
    foreach([0,5,6,7]as$e) {
        preg_match('/(X|O)(.{'.$e.'}\1){4}/',$b)-1?:die("P1 Wins");
    }

    #Check if Chaos wins
    strstr($b,'.')?'':die("P2 Wins");
}

हाँ, नोटिस ठीक हैं।
ASCIIThenANSI

4

जावास्क्रिप्ट, 360

संशोधित इंटरैक्टिव गेम संपादित करें , MSIE में भी चलना चाहिए

जैसा कि अनुरोध किया गया है, पाठ आधारित खेल, पॉपअप के माध्यम से इनपुट, कंसोल में आउटपुट (ताकि एक मोनोस्पॉन्टेड फ़ॉन्ट हो)।

'Q' के साथ गेम छोड़ें या प्रॉम्प्ट पर 'Cancel' क्लिक करें।

ES5 सुविधाओं का उपयोग नहीं करते हुए, यह किसी भी मध्यम ब्राउज़र पर चलना चाहिए (जहाँ आपके पास JS कंसोल पैनल हो सकता है)

b='\n......'.repeat(6).split('');
for(h=t=0;!h&t<36;)
{
  i=prompt();
  if(i=='q')i=null;
  i=i.match(/([0-5]) ([0-5]) ([XO])/);
  m='INVALID';
  if(b[p=i?i[2]*7-~i[1]:0]=='.')
  {
    ++t;
    b[p]=i[3];
    m=b.join('');
    for(x=z='',c=0;c++<6;)
      for(x+='_',z+='_',r=0;r<6;r++)
        x+=b[c+r*7],z+=b[c<4?c-1+r*8:c+1+r*6];
    h=(/X{5}|O{5}/.test(b.join('')+x+z))
  }
  console.log(m);
}
console.log("P"+(2-h)+" WINS")

अब, कुछ और मजेदार इंटरएक्टिव और ग्राफिक संस्करण, खेलने के लिए स्निपेट चलाएं।


अच्छा क्लिक करने योग्य संस्करण! (लघु सुझाव: आप रेडियो बटन के बजाय दाएं / बाएं क्लिक का उपयोग कर सकते हैं।)
xebtl

@xebtl मैं इसे आजमाता हूँ
edc65

1

जावा, 565 चार्ट डी:

public class M{public static void main(String[]r){int[]p=new int[36];int u=0;for(;;){String l=new java.util.Scanner(System.in).nextLine();if(l == "q")break;int a=l.charAt(0)-'0'+(l.charAt(2)-'0')*6,i=p[a]==0?1:0;if(i>0)p[a]=l.charAt(4);u+=i;r(i==0?"INVALID\n":"");if(u==36){r("P2 WINS");break;}for(int x=0;x<6;x++)for(int y=0;y<6;y++)for(int d=0;d<3;d++)try{int e=1,c=p[x+y*6],z=x,h=y;if(c=='X'||c=='Y'){for(;e<6;e++){if(d%2==0)z++;if(d>0)h++;if(p[z+h*6]!=c)break;}if(e==5){r("P1 WINS");return;}}}catch(Exception e){}}}static void r(Object o){System.out.print(o);}}

यह शायद अब तक का सबसे लंबा कोड-गोल्फ है। मैं वास्तव में इस पर अच्छा नहीं हूँ।


1

ऑक्टेव, 453

format plus 'XO.'
disp(F=zeros(6))
r=@()fread(0,1);R=@()r()-47;q=@(m)printf(m)&&quit;e=@()q("INVALID");l=@(n)n<1||n>6&&e();s=@()r()==32||e();w="P1 WINS";f=@(v)abs(sum(v))==22.5&&q(w);g=@(m)any(abs(sum(m))==22.5)&&q(w);d=@diag;while 1
i=R();i==66&&quit;l(i);s();l(j=R());s();F(j,i)&&e();abs(v=R()-36.5)==4.5||e();F(j,i)=v;disp(F)
r();f(d(F,-1));f(d(F,0)(2:6));f(d(F,0)(1:5));f(d(F,1));g(F(1:5,:));g(F(2:6,:));g(F(:,1:5)');g(F(:,2:6)');F&&q("P2 WINS");end

कार्यान्वयन काफी सीधा है, format plusमुद्रण की देखभाल के लिए उपयोग करने के लिए एकमात्र वास्तविक "ट्रिक" । यहाँ एक टिप्पणी संस्करण है:

format plus 'XO.'               # this is where the magic happens

## initialize and print empty board
disp(F=zeros(6))

## shortcuts
r=@()fread(0,1);
R=@()r()-47;
q=@(m)printf(m)&&quit;
e=@()q("INVALID");
l=@(n)n<1||n>6&&e();
s=@()r()==32||e();
w="P1 WINS";
f=@(v)abs(sum(v))==22.5&&q(w);
g=@(m)any(abs(sum(m))==22.5)&&q(w);
d=@diag;

while 1
  i=R();                        # read index 1
  i==66&&quit;                  # ‘q’?
  l(i);                         # check bounds
  s();                          # read and check space
  l(j=R());                     # read and check index 2
  s();                          # read and check space
  F(j,i)&&e();                  # square already filled?
  abs(v=R()-36.5)==4.5||e();    # valid mark?
  F(j,i)=v;                     # assigndisp(F)                       # and print board
  r();                          # read off newline

  ## check diagonals
  f(d(F,-1));
  f(d(F,0)(2:6));
  f(d(F,0)(1:5));
  f(d(F,1));

  ## check rows
  g(F(1:5,:));
  g(F(2:6,:));

  ## check columns
  g(F(:,1:5)');
  g(F(:,2:6)');

  ## check chaos
  F&&q("P2 WINS");
end

इनपुट सिंटैक्स और वैधता की जांच करने की आवश्यकता के कारण, कोड fread()एक बार में एक वर्ण पढ़ने के लिए उपयोग करता है।

मैंने बोर्ड और संदेशों को चुस्त तरीके से पेश करने का ध्यान रखा। यदि कुछ अतिरिक्त उत्पादन स्वीकार्य है, तो मैं बाइट्स के एक जोड़े को बंद कर सकता हूं। उदाहरण के लिए, स्वचालित प्रिंटिंग (नहीं disp(F)) का उपयोग करते हुए , बोर्ड के रूप में दिखाया जाएगा

F =

......
......
......
......
......
......

इसके अलावा, मैंने व्याख्या की कि प्रत्येक कदम एक अलग लाइन पर दिया गया है।


नमूना अंतःक्रिया ( -qस्विच ऑक्टेव के हेडर को दबाने के लिए है):

$ octave -q order_chaos.m 
......
......
......
......
......
......
3 3 X
......
......
......
...X..
......
......
2 3 O
......
......
......
..OX..
......
......
3 3 O
INVALID

अमान्य चाल के कारण कार्यक्रम से बाहर निकल गया (यह सुनिश्चित नहीं था कि क्या इरादा था)।


बस यह सुनिश्चित करने के लिए (क्योंकि पहले कुछ भ्रम था), यह दोनों खिलाड़ियों से इनपुट लेता है, और वास्तव में गेम की नकल करता है, बजाय जाँच के कि क्या कोई दिया गया बोर्ड जीतता है?
ASCIIThenANSI

@ASCIIThenANSI बस इतना ही। यह फॉर्म की प्रत्येक चाल की x y tएक अलग लाइन (और कोई अन्य इनपुट) की अपेक्षा करता है ।
xebtl

और यह हर इनपुट के बाद बोर्ड को प्रिंट करता है?
ASCIIThenANSI

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