Порядок і Хаос і Кодегольф


10

Порядок і хаос - це варіант Tic-Tac-Toe, який відтворюється на дошці 6x6. Однак, що робить гру унікальною, це те, що обидва гравці можуть розміщувати або X, або O! Кожен хід (починаючи з порядку), гравець розміщує X або O в будь-якому незайнятому квадраті.
Виграти просто. Виграйте замовлення, якщо на дошці є 5 Xs або Os (вертикально, горизонтально або по діагоналі). Хаос виграє, якщо дошка заповнена, а на дошці немає рядків 5 Xs або Os. Ваша робота? Ну, оскільки це головоломки для програмування та код-гольф, ви збираєтеся програмувати гру та грати в неї.

Правила

  • Ви повинні прийняти введення як x y t, де xі yє координатами, і tце тип плитки ( Xабо O). Координати починаються з 0 0верхнього лівого кута і збільшуються до 5 5(нижнього правого кута).
  • Ви повинні прийняти qвийти та надрукувати, INVALIDякщо користувач вводить недійсні координати, плитки, будь-який ввід не у формі x y tабо намагається розмістити плитку там, де вона вже є. (Єдиним винятком є ​​те q, що це закриває програму.)
  • Якщо замовлення переможе, ви виведете P1 WINS. Якщо Хаос переможе, ви виведете P2 WINS.
  • Замовлення має бути першим.
  • Порожній пробіл представлений символом ..
  • Плитки бувають Xі O(великі). Ви не повинні приймати малі регістри, але потрібні великі регістри.
  • Ваша рада повинна складатися лише з .XO .
  • Ви насправді імітуєте обох гравців, які грають у гру, не отримуючи дошку та перевіряючи, хто виграє. Він приймає хід як вхід, потім друкує дошку, приймає інший хід і так далі, поки не виграє один гравець.

Початкова дошка виглядає так:

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

А після введення першого гравця (Порядок) 1 2 Xвін повинен виглядати так:

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

Так само, коли наступний гравець (Хаос) введе 3 3 O, це буде виглядати приблизно так:

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

І це триває, поки не виграє один гравець.

Як завжди, стандартні лазівки, які витягують задоволення від усього , заборонені.

Виграв той, хто має найкоротший код 15 червня, 00:00 UTC (приблизно через місяць з моменту опублікування цього виклику.)


Що робити, якщо гравець набирає позицію, яка вже зайнята?
Loovjo

@Loovjo Повертається INVALID. Я це відредагував зараз, спасибі.
ASCIIThenANSI

1
Чи слід виходити з гри, як тільки виявлено 5 плиток підряд?
Кайл Канос

1
Можливо, я її не помітив, але чи потрібно друкувати дошку на екрані або просто перевіряти стан дошки та виводити, який гравець виграє?
Кодос Джонсон

@Andrew Я насправді мав намір імітувати гру. Ви приймаєте внесок кожного гравця, по черзі, а потім перевіряєте, чи гравець виграв кожен крок. Опис не зрозумілий?
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

JavaScript, 360

Редагування Модифікована інтерактивна гра повинна працювати навіть у MSIE

За потребою, гра на основі тексту, введення через спливаюче вікно, вихід у консолі (щоб мати односкладний шрифт).

Завершіть гру з "q" або натисніть "Скасувати" у відповідь на запит.

Не використовуючи 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

Java, 565 символів D:

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):

$ 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.