Давай поиграем в гольф!
С учетом состояния крестики-нолики (пример :)
|x|x|o|
|x|o|x|
|o|o|x|
Определите, является ли игра win
а lose
или cat
. Ваш код должен выводить любую из этих опций с учетом состояния. Вышеприведенная игра должна вывестиlose
Просто чтобы прояснить: выигрыш определяется как любые 3 x
с подряд (диагональ, горизонталь, вертикаль). проигрыш - 3 o
с подряд, а cat
игра - ни одного подряд.
Чтобы сделать вещи интересными, вы должны определить свою структуру ввода для состояния, которое вы должны затем объяснить. Например, xxoxoxoox
допустимое состояние, как показано выше, где каждый из символов читается слева направо, сверху вниз. [['x','x','o'],['x','o','x'],['o','o','x']]
это игра в многомерном массиве, читаемая аналогичным образом. В то время 0x1a9
как шестнадцатеричное для 110101001
может работать как подходящее сжатие, где 1
можно манипулировать для x
s и 0
можно манипулировать для o
.
Но это всего лишь некоторые идеи, я уверен, что у вас их может быть много.
Ключевые правила:
- Ваша программа должна быть в состоянии принять любое жизнеспособное состояние.
- Форма ввода должна быть в состоянии представить любое состояние.
- «Состояние победы должно быть определено с доски»
- Предположим, полная доска
Win
перед,lose
например, в случае «xxxoooxxx»
Наименьшее количество персонажей выигрывает
(win|lose|cat) [xo]{9}
где первое слово обозначает, является ли игра победой, поражением или кошкой (?) Для игрока х. Способен представлять любое государство.Ответы:
Ruby 2.0, 85 символов
Вот простое решение на основе битовой маски в Ruby:
Доска представлена в виде шестнадцатеричного числа, состоящего из девяти бит, соответствующих девяти квадратам. 1 - это
X
, 0 - этоO
. Это так же, как0x1a9
пример в вопросе, хотя0x
это необязательно!Вероятно, есть лучший способ сделать битовые маски, чем просто жестко кодировать большой список. Я с радостью приму предложения.
Посмотрите, как это работает на Ideone здесь .
источник
273
дважды. И мне очень нравитсяmax
идея!Mathematica, 84 символа
Формат ввода:
{{1, 1, 0}, {1, 0, 1}, {0, 0, 1}}
источник
Tr@a
есть след поля (сумма по диагонали),Tr@Reverse@a
есть след перевернутого поля (некоторые более анти-диагональ),Tr/@a
будетTr
применяться к каждой строке, которая дает вам сумму по каждой строке,Total@a
дает вам сумму по каждой колонке. В общем, у вас есть все 8 строк, которые нужно проверить. ЗатемWhich
вещь применяется к этому (в основном, кif/elseif/else
выражению), где#
представляет этот список из 8 значений.if
есть3
победа,else if
есть0
проигрышelse if 1>0
(правда)cat
.Баш:
283262258Отличается относительно дружественным интерфейсом.
Выполнить
bash tictactoe.sh O X O X O X X O X
Примечание: список из 9 позиций является стандартным матричным представлением. Неважно, если доска представлена в виде основной колонки или основной строки, читается слева направо или сверху вниз - игры в крестики-нолики и крестики (или крестики-нолики, если вы настаиваете) симметричны, поэтому порядок ввода должен быть несущественным к результату в каждой правильной реализации, пока вход является линейным.
Редактировать: Благодаря HJK для более короткого предложения синтаксиса функции.
источник
t() { ... }
вместоfunction t
? Можно сохранить некоторые символы там. :)<<<
чтобы сохранить еще четыре символа.Befunge 93 - 375
Принимает двоичную строку в качестве ввода.
Читает строку. Bruteforce пишет это (самая правая вертикальная полоса) в виде матрицы между
добавление решетки (idk). Определяет сумму столбцов, строк и двух диагнозов. Сравнивает эти значения с 3 («победа») или 0 («проигрыш»), иначе, если все значения равны 1 или 2, тогда ничья («кошка»).
источник
GolfScript, 27 символов
Формат ввода - это строка, состоящая из восьми восьмеричных цифр, каждая из которых (избыточно) кодирует три последовательных квадрата платы:
Чтобы закодировать последовательность (строка / столбец / диагональ) из трех квадратов в виде восьмеричной цифры, замените каждый
x
в последовательности на 1, а каждыйo
на 0, и интерпретируйте полученную последовательность из единиц и нулей как двоичное число от 0 до 7 включительно.Этот формат ввод довольно лишний (все позиции досок кодируются по меньшей мере в два раз, с центральным положение кодировало четыре раза), но это однозначно представлять любое возможное состояние полностью заполненный крестики-нолики борта, и не напрямую кодировать победитель на входе.
Входные данные могут, необязательно, содержать пробелы или другие разделители между цифрами. На самом деле, все, что действительно волнует программу, это то, содержит ли входная строка цифры
7
или0
.Например, пример платы:
может быть представлен входом:
Для удобства вот программа GolfScript для преобразования макета художественной доски ASCII, как показано в задании выше, во входную строку, подходящую для этой программы:
Этот конвертер игнорирует любые символы, кроме
x
иo
, в любом случае, при вводе. Он генерирует однозначную строку (в комплекте с разделителями пробелов, как показано выше), подходящую для ввода в программу определения выигрыша, указанную выше, поэтому объединение этих двух программ можно использовать для определения победителя непосредственно с доски объявлений ASCII.Кроме того, вот обратный преобразователь, просто чтобы продемонстрировать, что вход действительно однозначно представляет плату:
Ps. Вот онлайн-демонстрация этого решения.
источник
Python 2 - 214 байтов
Я уверен, что есть улучшения, которые будут сделаны.
Бежать:
который представляет эту доску:
Выход с
NameError
исключением во всех случаях, кромеcat
.источник
<<<
! +1 только за это../whatever <<< 'blah blah blah'
то же самое,echo -n 'blah blah blah' | ./whatever
но без отдельного процесса дляecho
.echo
inbash
на самом деле является встроенным, поэтому не разворачивает новый процессHaskell, 146 символов
OK :). Мое представление доски является одним из тех 126 символов
Вот решение в 146 символов:
И вот как это работает, как скрипт на haskell:
источник
JavaScript, 420 символов
В этой версии
s
содержится целое число, которое представляет состояние игрового поля. Это битовый массив значений, где два бита представляют каждый квадрат на доске:10
- ИКС11
- О00
- Пустой квадратЭто решение использует битовую манипуляцию для проверки каждой из восьми возможных конфигураций «три в ряд» (оно проверяет их каждый дважды, один раз для X и один раз для O).
Я представляю это с небольшим уменьшением на моем сайте Tic-Tac-Toe, где эта
detectWin
функция используется как часть настоящей игры Tic-Tac-Toe.источник
Рубин, 84 персонажа
Простое решение на основе RegExp. Формат ввода представляет собой 9-значную двоичную строку, например
110101001
для примера платы, приведенной в вопросе.Рубин, 78 знаков
Формат ввода:
xxo_xox_oox
источник
Хаскелл, 169
Формат ввода: «X» представлен только как
x
, «O» только какo
. Внутри каждой строки символы являются одновременными без пробелов и т. Д. Строки разделены новыми строками.Создает все возможные строки / столбцы / диагонали, затем фильтрует
[("ooo","lose"),("xxx","win")]
их по существованию на доске, затем выбирает второе слово в кортеже, чтобы мы знали, какие игроки выиграли. Мы готовимся к"cat"
тому, чтобы взять последний элемент списка в качестве нашего победителя. Если оба игрока выиграют,"win"
будет последним (список пониманий поддерживает порядок). Так"cat"
как всегда первый, если победитель существует, он будет выбран, но в противном случае последний элемент все еще существует в качестве предшествующего"cat"
гарантирует непустоту.РЕДАКТИРОВАТЬ: побрил 3 символа, изменив понимание последнего списка на
map
.источник
С, 150 ок
У нас полночь, я не тестировал , но я все равно опубликую концепцию. Я вернусь к этому завтра.
Пользователь вводит два восьмеричных числа (я хотел использовать двоичные числа, но, насколько я знаю, C поддерживает только восьмеричные):
a
представляет центральный квадрат, 1 для X, 0 для Ob
представляет собой девятизначное число, представляющее квадраты по периметру, окружающие доску, начиная с одного угла и заканчивая в том же углу (с повторением только этого угла), 1 для X, 0 для O.Есть два возможных способа выиграть:
центральный квадрат X (
a
= 1) и два противоположных квадрата также X (b&b*4096
ненулевой)три соседних квадрата периметра - это X (
b/8 & b & b*8
ненулевое значение). Это действительный выигрыш, только если средний квадрат является квадратом ребра, а не угловым квадратом, поэтому необходимо также применять маскуm
, чтобы избежать случаев угловых квадратов.Потеря обнаруживается с помощью переменной с, которая является обратной к б.
источник
m
при обнаружении «проигрыша»c/8&c&c*8
. Я изменил ваш код (без проверки его работы) следующим образом:int a,b;t(v){return a&&v&v<<12||v/8&v&v*8&0x208208;}main(){scanf("%o%o",a,b);printf("%s",t(b)?"win":t(b^0x1249249)?"lose":"cat");}
(130 символов). Повторный тест был достаточно длинным, чтобы извлечь его из тестовой функцииt()
; это устраняет необходимостьc
иm
; константы конвертируются в гекс, чтобы сохранить один символ каждый.printf
строка формата не нужна - просто укажите строку результата в качестве формата - илиputs
это, так как вопрос не запрашивает перевод строки после вывода! (сохраняет еще 7 символов).Bash,
107103Создает и запускает сценарий sed.
Формат ввода / вывода:
oxo-oox-xoo
выходные данныеlose
(используйте-
для разделения строк). Вход на стандартный ввод. Требуется GNU sed дляc
команды.Я интерпретировал правило 5 как «если возможны как выигрыш, так и проигрыш, выберите выигрыш».
Основной код
Это фактический ответ.
Ничего интересного на самом деле. Он определяет,
$b
как/cwin
сохранять символы, затем определяет часть сценария с условием выигрыша, а затем используетsed y/x/o/\;s$b/close/
для преобразованияx
вo
иcwin
вclose
(таким образом, генерируя условия проигрыша). Затем он отправляет две вещи иccat
(которые будут выводиться,cat
если не найдено ни одного условия выигрыша / проигрыша) в sed.Сгенерированный код
Это скрипт sed, сгенерированный и запущенный скриптом Bash.
В регулярных выражениях
.
соответствует любому символу и после нихcTEXT
печатает TEXT и завершается, если регулярное выражение сопоставлено.Это может работать как отдельный скрипт sed. Это 125 символов в длину, вы можете посчитать это другим решением.
источник
Python 3, 45
Входные данные -
i
это список чисел, представляющих каждую строку, столбец и диагональ игрового поля, например:представлен
[6, 2, 1, 4, 6, 1, 7, 4]
.Код :
('cat','lose','win')[2 if 7 in i else 0 in i]
источник
Дротик - 119
(См. Dartlang.org ).
Оригинальная версия с использованием RegExp: 151 символов.
Ввод в командной строке - 11 символов, например, «xxx | ooo | xxx». В качестве разделителя можно использовать любой символ, отличный от xo.
Ведущие пробелы и символы новой строки должны быть пропущены перед подсчетом символов, но я по возможности сократил внутренние пробелы. Хотелось бы, чтобы был меньший способ сделать подстроку.
Версия с рекурсивной битовой базой: 119 символов. Входные данные должны быть 9-битными числами, где 1 представляют «x», а 0 - «o».
источник
CJam,
39 3836 знаковЭто базовый преобразованный код для
длиной 52 символа.
Входные данные - это просто строковое представление доски, начиная сверху слева и переходя строка за строкой. Например:
что приводит к
win
выводу. Иличто приводит к
cat
выводу и т. д.Код просто выполняет следующие три вещи:
q3/_
- разбить строку на части по 3, т.е. на строку_z
- Скопируйте массив для каждой строки и транспонируйте в массив для каждого столбца.__Wf%s4%
- Переверните каждый ряд и получите диагональ слева направо. Это вторичная диагональ доски.\s4%
- Получить основную диагональ доски]`
- Обернуть все в массиве и привести в порядок массив.Теперь у нас есть все возможные группы из 3 с доски. Мы просто проверяем наличие «ooo» и «xxx», чтобы определить результат.
Попробуйте онлайн здесь
источник
GNU sed, 25 байт
Если вход является избыточным представлением доски с отдельными представлениями для столбцов, строк и диагоналей, как также используется в других ответах, то sed очень хорошо подходит для проверки конечного состояния игры с наименьшим количеством байтов.
Формат ввода:
xxx ooo xxx xox xox xox xox xox
(состояние платы взято из вопроса ОП)Если входной формат не является избыточным (
xxx ooo xxx
), то приведенный выше код sed работает только в том случае, если ему предшествует строка ниже, что делает программу длиной 96 байт (с учетом необходимогоr
флага).источник
Баш: 208 символов
Выполнить
bash tictactoe.sh 0 1 0 1 0 1 1 0 1
Вдохновлен этим ответом .
источник
VB.net
С помощью примера обеспечить кодируется как следующий битовый шаблон
Теперь мы можем определить результат (или победителя), выполнив следующее.
источник
J - 97 байт
Ну, самый простой доступный подход. Ввод принимается как
111222333
, где числа представляют строки. Читайте слева направо. Игрок есть,x
а враг естьo
. Пустые квадраты могут быть чем угодно, кромеx
илиo
.Примеры: (NB. Это комментарий)
Ungolfed код объяснения
источник
Python 2, 120 байт
Или Python, 115 байт из оболочки Python (2 или 3):
Переменная board установлена в двоичный формат, описанный в вопросе:
1
для X,0
для O, слева направо, сверху вниз. В этом случае101001110
представляетЧто приводит к выходу:
Cat
источник
Python (
7362 символа)Входными данными являются четыре строчные строчные буквы, представляющие четыре различных вида одной и той же платы, все объединенные в одну строку: по строке, по столбцу, по диагонали справа, по диагонали слева.
ОБНОВИТЬ
Спасибо theRare за хороший пример для подражания! Каждый вид доски вместе с каждым сегментом (строкой или столбцом) внутри доски должен быть отделен символом, который не является ни «x», ни «o», чтобы структура доски сохранялась даже после объединения. Границы вокруг каждого вида доски будут в квадратных скобках ("[" и "]"), а разделитель между строками / столбцами будет символом "|".
Это делает алгоритм простым - просто ищите «xxx» или «ooo» для выигрыша или проигрыша, соответственно. В противном случае это галстук (кот).
Например, доска (чтение слева направо, сверху вниз) ...
X | X | X X | O | X O | X | O
... представляется как «[xxx | xox | oxo]» (по строкам) + «[xxo | xox | xxo]» (по столбцам) + «[xoo]» (правый диагон) + [xoo] »(левый diag) = "[xxx | xox | oxo] [xxo | xox | xxo] [xoo] [xoo]".
Этот оператор Python печатает результат игры, учитывая переменную s в качестве входных данных:
источник
OXX XOO XOX
(это должен быть кот)?Haskell (69 символов)
Это принимает те же данные, которые описаны в этом ответе . Более конкретно, вводом является 8 восьмеричных значений, описывающих двоичное значение каждой строки, столбца и диагонали. Код заставляет каждый экземпляр 7 «выигрывать», каждый экземпляр 0 «проигрывать» и удаляет все остальное. Затем он добавляет «кошку» в конец и берет первые 4 символа из результата.
Будет 4 возможных ответа: «проиграть», «кошка», «победа», за которыми следует «l», и «победа», за которой следует «с», что не запрещено правилами :)
Пример использования:
источник
J: 83
Использование: просто добавьте строку с х и о и наблюдайте за магической работой. например. 'Xxxoooxxx.
Внутренний глагол
(+/@:(*./"1)@;@(;((<0 1)&|:&.>@(;|.)(,<)|:)))
основном, объединяет исходную двоичную матрицу, а транспонирование упаковывается вместе с двумя диагоналями. Эти результаты сравниваются; суммы строк взяты для определения выигрышей, а затем суммируются. далее я назову этот глаголInner
.Для нахождения победителя, разница в баллах между нормальной и инвертированной двоичными матрицами берется за крючок
(-&Inner -.)
.Оставшаяся часть кода просто делает выводы и выбирает правильный.
источник
JavaScript,
133, 114 символовВвод
i
представляет собой простую строку с разделителями для строк, т.е.100|001|100
Изменить: обновил мой метод, чтобы заменить 1 в регулярном выражении с нулями, чтобы проверить случай потери.
источник
=
и кавычки вокруг литерала регулярного выражения. Кроме того,1...
один символ короче1.{3}
.r.test(i)
также на один символ корочеi.match(r)
.J - 56 (26?) Символ
На вход дается матрица 3х3 из девяти символов, потому что J может поддерживать это как тип данных, LOL.
Примеры:
Если нам разрешено кодировать в восьмеричной системе Golfscriptish избыточно представляющее состояние каждой строки, столбца и диагонали, то это всего лишь 26 символов:
источник
T-SQL (2012), 110
select max(iif(@&m=0,'lose',iif(@&m=m,'win','cat')))from(VALUES(292),(146),(73),(448),(56),(7),(273),(84))z(m)
Ввод представляет собой шестнадцатеричное число. Это в значительной степени перевод решения ruby на T-SQL, довольно приятный и аккуратный.
источник
Javascript 1.6, 71 символ
Я предполагаю input как массив,
game
который содержит каждую строку, каждый столбец и каждый diag в виде строки из 3 символов. Аналогичен ответу Боба , но он представлен в виде массива, а не в виде объединенной строки.EDIT @ nyuszika7h комментарий (67 символов)
источник
~game.indexOf("xxx")
вместо тогоgame.indexOf("xxx")>=0
же, для другого.Java 7, 260 байт
Ungolfed и тестовые случаи:
Попробуй это здесь.
Выход:
источник
APL (NARS), 69 символов, 138 байтов
Входные данные должны быть одной матрицей 3x3 или одним линейным массивом из 9 элементов, который может быть только 1 (для X) и 0 (для O), результатом будет «cat», если никто не выигрывает, «проигрывать», если O выигрывает, «win» «если Х выиграет. Не существует проверки на одну недопустимую плату или вход, если в одном массиве менее 9 элементов или более, или проверьте каждый элемент <2.
В качестве комментария: он преобразует входные данные в матрицу 3x3 и создает один массив с именем «x», где элементы представляют собой сумму каждого столбца строки и диагонали.
Некоторые тесты показывают пример, показанный другими:
источник