Банк был взломан, и у всех местных мафиозных головорезов есть необычное алиби: они были дома, играя в Connect 4! Чтобы помочь в расследовании, вас просят написать программу для проверки всех досок Connect 4, которые были изъяты, чтобы проверить, что позиции действительно являются позициями в действующей игре Connect 4 и не были спешно собраны вместе как только полиция постучала в дверь.
Правила подключения 4: игроки R
и Y
по очереди бросают плитки своего цвета в столбцы сетки 7x6. Когда игрок бросает плитку в столбец, он падает, чтобы занять самую низкую незаполненную позицию в этом столбце. Если игроку удается получить горизонтальный, вертикальный или диагональный ряд из четырех плиток своего цвета на доске, то он выигрывает, и игра немедленно заканчивается.
Например (с R
запуском), следующая позиция Connect 4 невозможна.
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R| | | | |
| | |Y| | | | |
|R| |Y| | | | |
Ваша программа или функция должны принимать плату Connect 4 и возвращать либо
- Ложное значение, указывающее, что позиция невозможна или
- Строка чисел от 1 до 7, что указывает на одну возможную последовательность ходов , ведущих к этой позиции (столбцы пронумерованы ,
1
чтобы7
слева направо, и так последовательности112
, например, указывает на красный движение в колонке1
, а затем желтый ход в столбце с1
последующим красным движением в столбце2
). Вы можете выбрать нумерацию столбцов, отличную от 1234567, если хотите, если вы указали в своем решении. Если вы хотите вернуть список в другом формате; например, в качестве массива[2, 4, 3, 1, 1, 3]
, это тоже хорошо, если легко увидеть, что движется.
Вы можете выбрать чтение доски в любом разумном формате, включая использование букв, отличных от R
и Y
для игроков, но вы должны указать, какой игрок идет первым. Вы можете предположить, что доска всегда будет 6х7 с двумя игроками.
Вы можете предположить, что полученные вами позиции, по крайней мере, физически возможно создать на стандартной плате Connect 4; то есть, что не будет «плавающих» фигур. Вы можете предположить, что доска будет непустой.
Это код гольф, поэтому самый короткий ответ выигрывает. Применяются стандартные лазейки.
Примеры
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | --> 1234567 (one possible answer)
| | | | | | | |
|R|Y|R|Y|R|Y|R|
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R| | | | | --> false
| | |Y| | | | |
|R| |Y| | | | |
| | | | | | | |
| | |Y| | | | |
| | |R| | | | |
| | |Y| | | | | --> 323333 (only possible answer)
| | |R| | | | |
| |Y|R| | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | --> false (this is the position arising after
| |Y|Y|Y|Y| | | the moves 11223344, but using those moves
| |R|R|R|R| | | the game would have ended once R made a 4)
| | | | | | | |
| | | | | | | |
|Y| | | | | | |
|R|Y| | | | | | --> 2134231211 (among other possibilities)
|R|R|Y| | | | |
|Y|R|R|Y| | | |
| | | | | | | |
| | | | | | | |
|Y| | | | | | |
|R|Y| | | | | | --> false (for example, 21342312117 does not
|R|R|Y| | | | | work, because Y has already made a diagonal 4)
|Y|R|R|Y| | |R|
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | --> 112244553 or similar
|Y|Y| |Y|Y| | |
|R|R|R|R|R| | |
источник
Ответы:
Желе , 57 байт
Принимает матрицу, где
0
незаполнен,1
воспроизводится первым и2
воспроизводится вторым. Возвращает список из 1-индексированных столбцов, пустой, если обнаружена подделка.Попробуйте онлайн! (слишком неэффективно для более чем 7 штук, чтобы запустить менее чем за минуту)
Заметка:
ZṠṢ€Ƒȧ
+6 байт)источник
JavaScript (ES6),
202 194 187183 байтаПринимает входные данные в виде матрицы с для красного, для желтого и для пустого. Возвращает строку с 0-индексированными ходами (или пустую строку, если решения не существует). Красные начинают игру.2 4 0
Попробуйте онлайн!
Как?
Рекурсивная функция пытается заменить все и во входной матрице на и соответственно.g 2 4 1 3
При этом он гарантирует, что у нас не будет ни одного из четырех последовательных нечетных значений, пока все четные значения не исчезнут (т. Е. Если побеждает сторона, это должен быть последний ход).
Строка следующего доступного слота для каждого столбца сохраняется в .y x p[x]
комментарии
источник
f([ [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,2,0,2,0,0], [0,2,2,0,2,2,0], [1,1,1,1,1,1,1] ])
заканчивается0
иf([ [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,2,0,2,0,0], [2,2,2,0,2,2,1], [1,1,1,1,1,1,1] ])
должно быть правдойPython 2 ,
295285 байтПопробуйте онлайн!
-10 спасибо Джо Кингу .
Input представляет собой список строк, представляющих столбцы; с «1» для красного и «0» для желтого. Строки не дополняются. Итак, (фальшивый) случай:
вводится как:
Выход - это список индексов столбцов, с 0 индексами, которые могут составить плату; или
None
если это не верно.Принимает пустую доску как действительную (возвращает пустой список
[]
вместоNone
).Этот подход рекурсивен от последнего хода к первому ходу: основываясь на паритете общего количества предпринятых ходов, мы удаляем либо последний ход красных, либо последний ход желтых (или проваливаем, если это невозможно); проверьте получившуюся доску, чтобы увидеть, есть ли у противника 4-в-ряд (в этом случае неудача, потому что игра уже должна была остановиться); в противном случае повторяйте процедуру до тех пор, пока доска не станет пустой (что действительно).
Код «4 в ряд» - самая расплывчатая часть. Все диагональные строки для матрицы
b
генерируются:которая сначала перечисляет «наклонные» диагонали, а затем «наклонные».
источник