Вызов
Если у вас есть крестики-нолики в любом формате, определите, действителен ли он или нет. Если доска может быть результатом игры в крестики-нолики, то она действительна. Например, эта доска действительна:
XOX OXO XOXНаоборот, эта доска недействительна:
XXX XXO ООО
вход
- Полный (9/9) крестики-нолики (результат, а не игра).
правила
- Формат ввода должен быть способен отображать все 512 возможных плат ввода. Он должен быть указан вместе с инструкциями по его созданию, если он неясен / неясен. Вы должны указать маркировку доски в отдельности.
- Должно быть два возможных выхода, один для достоверности и один для недействительности.
- Можно предположить, что на доске нет пустых мест.
Контрольные примеры
Действительно:
XOX OXO XOX XOX XOX OXO Xoo OOX OXX OXO XOX OXO
Инвалид:
XXX XXX XXX ООО ООО ООО XXX ООО XXX ООО OOX XXX XXO OXO OOX
Небольшая помощь?
Доска считается действительной (для этой задачи) тогда и только тогда, когда выполняются следующие два условия:
- Есть 5 X и 4 O, или 4 X и 5 O. Например,
XXX OXO XXX
считается недействительным, потому что есть 7 X и 2 Os. - Победил только игрок с 5-ю отметками, или ни одна из них не победила. Например,
XXX ООО OOX
считается недействительным, поскольку строкаO
s или строкаX
s будут сформированы первыми. Два игрока не могут иметь свой ход одновременно.
Текущий победитель ...
... ответ Jelly ais523 , с поразительными 26 байтами!
code-golf
decision-problem
tic-tac-toe
Эрик Outgolfer
источник
источник
O O O
X O X
X O X
, чтобы показать, что у одного и того же игрока может быть как горизонтальный, так и вертикальный ряд.Ответы:
Желе , 26 байт
Попробуйте онлайн!
Формат ввода немного необычный; это строка, представляющая доску, но с символами новой строки Windows (перевод каретки с последующим переводом строки). Например,
XXO\r\nOXO\r\nOOX
. (На самом деле, любая двухсимвольная строка заполнения между строками работает, но переводы строки Windows гораздо более оправданы, чем другие варианты.)Основная идея заключается в том, что мы ищем символы, которые появляются 4 раза на входе, но не имеют трех равномерно распределенных вхождений в исходной строке. С двумя или более символами заполнения между линиями сетки 3 × 3 все горизонтальные, вертикальные и диагональные линии расположены равномерно, но никакая другая равномерно не может содержать три элемента.
Объяснение:
Символы
ð
иµ
являются разделителями цепей , которые разбивают программу на несколько частей, каждая из которых независима. Я заменил их пробелами ниже, чтобы сделать вещи немного яснее.Другими словами, мы находим список символов, которые появляются ровно четыре раза на входе, и составляем список, состоящий из трех копий каждого из них; мы находим список всех подпоследовательностей, которые равномерно распределены в исходной строке; и если мы вычтем второе из первого, мы хотим, чтобы результат имел длину 1 (то есть игрок сыграл четыре раза, но не выиграл). Обратите внимание, что, поскольку мы находимся в сетке 3 × 3 и каждый квадрат заполнен, оба игрока не могут играть четыре раза. В Jelly 1 - истина, 0 - ложь, поэтому нам не нужно делать ничего особенного, чтобы преобразовать полученный список в логическое значение. (
µL
Требуется, однако, потому что в противном случае и то“XXX”
и другое“OOO”
были бы возможны истинные выходные значения, и вопрос требует, чтобы все действительные платы давали одинаковый вывод.)источник
JavaScript (ES6),
8887 байтПринимает входной сигнал в виде строки из 9
0
и1
символов и возвращается1
за действительное,0
для инвалида. Мы сортируем персонажей по порядку. Если средние три символа теперь одинаковы, то доска является недействительной, так как слишком много одного куска. В противном случае мы конвертируем исходную плату в двоичную, переворачивая биты, если больше0
s, чем1
s. На этом этапе плата действительна, если0
не имеет строки из трех, поэтому мы просто тестируем все восемь строк с помощью массива битовых масок. Редактировать: 1 байт сохранен благодаря @ETHproductions.источник
Python 3,
13112712510096 байтДля другого алгоритмического подхода (и того, который действительно будет подходить для этих многобайтовых языков игры в гольф со встроенным сжатием), вместо вычисления, если плата действительна, давайте иметь 512-битное число, где каждый бит представляет, является ли или нет конкретная доска действительна или нет, и передают двоичное значение, представляющее доску. Кроме того, из-за симметрии, вторая половина таблицы может быть исключена вместе с кучей нулей:
Значение теста:
Представляется в виде двоичного значения
0b111010111
, и функция возвращает ненулевое значение, если плата действительна.источник
a&(1<<b)
скобки не нужны.if b>255:b=511-b
!if
.Пакет, 140 байт
Принимает input как девять отдельных аргументов командной строки и выводит их
1
как действительные и0
недействительные. Работает, отслеживая количество раз, когда он видитO
и ортогональную линиюOOO
илиXXX
. Удобно, что Batch позволяет нам выполнять целочисленную арифметику косвенно, поэтому мы не увеличиваем,%%l
а вместо этого используем некоторую переменную (хотя нас интересуют только три упомянутые переменные). Затем нам нужно проверить, что либоX
не выиграло, и есть пятьO
с, либоO
не выиграло, и есть четыреO
с.источник
Mathematica,
8275 байтСпасибо Мартину Эндеру за сохранение 7 байтов!
Безымянная функция, принимающая 3х3 вложенный список 1 и 0 в качестве входных и выходных данных
True
илиFalse
.Использует некоторую удобную гибкость
Total
функции (здесь игра в гольфt
): приведенный пример массиваe = { {1,2,3} , {4,5,6} , {7,8,9} }
, командаt[e]
суммирует три вектора (здесь даются{12,15,18}
); командаt/@e
суммирует каждый подсписок индивидуально (здесь приводим{6,15,24}
); и командаe~t~2
суммирует все девять элементов (здесь результат45
).Итак, сначала мы проверяем, является
3<(b=#~t~2)<6
ли общее число 1 с 4 или 5; если нет, мы выходим сFalse
. Если это так, мы используем,c=If[b>4,1-#,#]
чтобы заставить быть четыре 1, а не пять. Затем мы вычисляем суммы столбцов, суммыt[c]
строкt/@c
, сумму главной диагоналиTr@c
и сумму противоположной диагоналиTr@Reverse~c
, и используем~FreeQ~3
для проверки, что3
не может появиться на любом уровне в этих вычисленных суммах.Забавное примечание: в отличие от большинства появлений на этом сайте, здесь
Tr
не используется для суммирования одномерного списка, но на самом деле используется как задумано - для расчета следа двумерной матрицы!источник
Pyth - 36 байт
Я включаю Diagas и использую две тройки вместо этого.
Тестирование
источник
JavaScript (ES6), 101 байт
Принимает входные данные в виде 9-битной двоичной маски, где
X = 1
иO = 0
(MSB = верхняя левая ячейка, LSB = нижняя правая ячейка).Контрольные примеры
Показать фрагмент кода
источник
Python 2,
1581321099291123 байтаВходные данные представляют собой список / кортеж строк, каждая из которых состоит из трех кортежей, например:
[('X', 'O', 'X'), ('O', 'X', 'O'), ('X', 'O', 'X')]
Сохранял несколько байтов, игнорируя диагонали в ответе @ Maltysen, что также сокращало следующее выражение.Спасибо @vaultah за сохранение1718 байт.Проверка диагоналей оказывается необходимой, что позволило снять большую часть вышеуказанной экономии.
Попробуй это здесь.
объяснение
f
является сплющенным входом для нарезки.w
содержит символы с выигрышными последовательностями.Подсчитайте вхождения каждого выигрышного персонажа, который будет равен 0, если
w
он пуст, или 5, еслиlen(w)
равен 1. Сумма 10, если у обоих есть последовательность выигрыша, невозможна. Победитель с 5 означает, что проигравший имеет 4. Вы не можете иметь> 5 без последовательности выигрыша.источник
lambda b:len({x[0]for x in b+zip(*b)if len(set(x))==1})<2and set(map(
b.count,'XO'))=={4,5}
сохраняет несколько байтов....and{4,5}==set(map(
b.count,'XO'))
сохраняет еще один байт.R,
8882 байтаВсе комбинации трех целых чисел от 1 до 9, которые суммируют до 15, представляют собой строки / столбцы / диагонали квадрата, показанного ниже.
Функция принимает входные данные как вектор логических значений, T для «X», F для «O», который является плоским представлением платы. НО, они переупорядочены так, что их индекс совпадает с числом в квадрате в порядке (2,7,6,9,5,1,4,3,8). Этот порядок может быть достигнут путем выравнивания доски обычным способом, а затем нарезкой на c (6,1,8,7,5,3,2,9,4). Так это
представляется как:
который:
Функция сначала определяет, есть ли игрок с ровно четырьмя отметками. Если это так, функция использует «факт вещей, которые складываются до 15», чтобы определить, есть ли у этого игрока три в ряд (доска недействительна, если этот игрок делает).
Если вы хотите использовать в качестве входных данных условно сплющенную плату, код будет выглядеть следующим образом:
Я новичок в этом, советы будут оценены.
источник
if()
вместо:f=function(x)
если(sum(x)%in%4:5,all(apply(combn(which(x==(sum(x)<5)),3),2,sum)!=15),F)
. Не всесторонне протестировано. Обратные следы разрушают код, но это такbacktick if backtick(
.x=scan();
если(sum(x)%in%4:5,all(apply(combn(which(x==(sum(x)<5)),3),2,sum)!=15),F)
и ввод как1
и0
. 82 байта.JavaScript (ES6),
145139131127 байтВвод в виде разделенной пробелами строки, такой как
"XOX OXO XOX"
. Выходы1
для неверной платы,0
для действительной. Это, очевидно, не лучший метод, по крайней мере, не с JavaScript ...Это в основном проверяет, выполняются ли оба следующих условия:
O
с, ИРегулярное выражение - проверить, была ли решена игра. Он соответствует доске, если есть какие-либо последовательности длины три из одного символа с 0 (строка), 2 (диагональ вниз-вправо), 3 (столбец) или 4 (диагональ вниз-влево), разделяющие каждую пару.
Тестовый фрагмент
Показать фрагмент кода
источник
Рубин,
104 9991 байтФормат ввода: двоичная строка из 9 символов (0 и 1), представляющая плату, например, первый тестовый пример
101010101
. Сначала преобразуйте его в двоичное число, проверьте, равняется ли popcount 4 или 5, если это 5, инвертируйте число, чтобы у нас всегда было 4. Проверьте, совпадают ли три из них (маскируя по горизонтали, вертикали и диагонали).TL; DR : вернуть false, если игрок с 4-мя выигранными выигрышами, в противном случае - true
Спасибо Джордан за комментарии,
Я не могу воспроизвести строку UTF-8, которая бы сохранила другой байт.
источник
.select{...}[0]
на.find{...}
."8ǀĤITđ".unpack("U*")
(в случае, если что-то теряется при переводе, строка является результатом вызоваpack("U*")
исходного массива; это 12 байтов).any?
вместоnone?
, переворачивая вывод и сохраняя целый байт?Perl 6 ,
10399 байтЛямбда, которая принимает список списков, как
(('X','O','X'), ('O','X','O'), ('X','O','X'))
, и возвращает Bool.Это работает так:
c
. (Если метка не появится ровно 5 раз, это будет содержать ложное значение)c
верно ли, и каждая выигрышная линия имеет типc
.источник
PHP, 125 байт
У меня была та же идея, что и у Арнаулда : плата действительна, если установлено 4 или 5 битов, и либо,
X
либоO
ни у кого нет полос (но не обоих).Чтобы сгенерировать ввод из поля, заменить
X
на1
иO
с0
, соединить строки и преобразовать двоичный код в десятичный, предоставив в качестве аргумента командной строки.печатные издания
1
для действительных; пустой вывод для недействительного. Беги с-r
.сломать
источник
Swift, 178 байт
источник
ES6 (Javacript),
130,138117 байтправок:
Чрезвычайно простой подход. Возможно, можно играть в гольф немного дальше.
Принимает ввод как 9 отдельных аргументов, 1 и 0
Аргументы: 1-3 - первый ряд, 4-6 - второй ряд, 7-9 - третий ряд.
Golfed
Интерактивный «Испытательный стенд»
источник
[1,0,1,1,0,1,0,1,0]
(XOX XOX OXO
).a+b+c+d+e+f+g+H+i
вместоF.reduce((r,c)=>r+=c*1)
(в какой момент вам это не нужноF
) б) писать.includes(C)
(и переходить кC
значению inline )?OOO XXX OXO
провал?