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

10

Порядок и Хаос - это вариант игры в крестики-нолики, играемый на доске 6х6. Однако уникальность игры заключается в том, что оба игрока могут поставить X или O! Каждый ход (начиная с Порядка) игрок помещает X или O в любой незанятый квадрат.
Победа проста. Орден выигрывает, если на доске 5 рядов X или Os (вертикально, горизонтально или по диагонали). Хаос побеждает, если доска заполнена и на ней нет строк по 5 X или Os. Твоя работа? Ну, так как это программирование головоломок и Code Golf, вы собираетесь программировать игру и играть в гольф.

Правила

  • Вы должны принять ввод как 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.
  • Вы фактически симулируете обоих игроков, играющих в игру, а не получаете доску и проверяете, кто победит. Он принимает ход как ввод, затем печатает доску, принимает другой ход и так далее, пока один из игроков не выиграет.

Стартовая доска выглядит так:

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

И после ввода первого игрока (Order) 1 2 Xэто должно выглядеть так:

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

Аналогично, когда следующий игрок (Хаос) вводит данные 3 3 O, это будет выглядеть так:

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

И это продолжается до тех пор, пока один из игроков не выиграет.

Как всегда, стандартные лазейки, которые извлекают удовольствие из всего , запрещены.

Победителем становится тот, у кого самый короткий код 15 июня, 00:00 UTC (примерно через месяц с момента публикации этого вызова).

ASCIIThenANSI
источник
Что если игрок введет позицию, которая уже занята?
Loovjo
@Loovjo Это возвращается 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

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

Теперь, еще более забавная интерактивная и графическая версия, запустите сниппет, чтобы играть.

edc65
источник
Хорошая кликабельная версия! (Незначительное предложение: вы можете использовать правый / левый щелчок вместо переключателей.)
xebtl
@xebtl Я попробую
edc65
1

Ява, 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);}}

Это, наверное, самый длинный код-гольф когда-либо. Я действительно не очень хорош в этом.

Loovjo
источник
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

Неверное перемещение вызвало выход из программы (не уверен, что это было задумано).

xebtl
источник
Просто чтобы удостовериться (потому что раньше была некоторая путаница), он принимает информацию от обоих игроков и фактически имитирует игру, а не просто проверяет, выиграла ли данная доска?
ASCIIThenANSI
@ASCIIThenANSI Просто так. Он ожидает, что каждое движение формы x y tна отдельной строке (и никаких других входных данных).
xebtl
И это печатает плату после каждого ввода?
ASCIIThenANSI
@ASCIIThenANSI Да, смотрите отредактированный ответ.
xebtl