Введение
Правила головоломки:
Головоломка Binary (также известная как Takuzu или Subiku) очень проста для понимания и имеет только несколько правил:
поскольку название игры бинарное, оно довольно очевидно, но вы можете заполнить только нули и единицы.
- Не более двух одинаковых цифр могут быть вертикально или горизонтально смежными друг с другом
- Каждая строка и каждый столбец должны содержать одинаковое количество нулей и единиц (это неявно означает, что каждая двоичная игра всегда будет иметь четные измерения).
- Не может быть дублированных строк и дублированных столбцов (с одинаковым порядком нулей и единиц).
Вы можете играть в игру на www.binarypuzzle.com, если хотите.
Тактика:
Из-за правила 1 мы всегда можем заполнить цифру, если:
- Уже есть две одинаковые цифры, вертикально или горизонтально смежные друг с другом, и в этом случае мы можем заполнить противоположную цифру с обеих сторон. Т.е. .11...
→ 0110..
.
- Есть две одинаковые цифры по вертикали или по горизонтали с одним пробелом между ними. Т.е. .1.1..
→.101..
В соответствии с правилом 1, когда три пробела оставлены, и у нас не может быть трех смежных одинаковых цифр, мы можем заполнить один из пробелов. Т.е. .0.1.0
→ 10.1.0
(нам еще нужно заполнить два, и у нас не может быть трех смежных в середине, поэтому первый пробел должен быть a 1
.)
Из-за правила 2 мы всегда можем заполнить оставшиеся пробелы в строке или столбце, если половина из них уже заполнена противоположной цифрой. Т.е. .1.011
→010011
Из-за правила 3 мы всегда можем заполнить противоположные цифры, если для решения одинаково упорядочены оставлены только две цифры. Т.е. 101100 & 1..100
→101100 & 110100
Из-за правила 3 мы можем иногда заполнить пробел, если на одинаково упорядоченной линии оставлены три пробела. Т.е. 010011 & .1.01.
→ 010011 & .1.010
(Здесь мы не можем заполнить a 1
в конце, потому что это означало бы, что мы должны заполнить нули в двух других пробелах, делая обе строки равными по порядку.)
Пример:
Мы начнем со следующей сетки 6х6 с заполненными нулями и нулями (а точки - это пробелы, которые нам еще предстоит заполнить):
.1....
.10.0.
1.11..
.1....
...1.0
......
В соответствии с правилами 1 и 2 мы можем заполнить эти цифры:
.1.01.
.1010.
101100
010011
.0.1.0
.010..
Из-за правила 1 мы можем заполнить 1 в строке 5, столбец 1:
.1.01.
.1010.
101100
010011
10.1.0
.010..
Из-за правила 3 мы можем заполнить 0 в строке 1, столбце 6 (если смотреть в строке 4):
.1.010
.1010.
101100
010011
10.1.0
.010..
Теперь мы можем продолжать заполнять пробелы цифрами в соответствии с правилами 1 и 2:
.1.010
010101
101100
010011
10.1.0
.010.1
Теперь мы можем закончить строку 5 из-за правила 3 (если смотреть на строку 3):
.1.010
010101
101100
010011
100110
.010.1
И тогда мы можем закончить головоломку по правилам 1 и 2:
011010
010101
101100
010011
100110
101001
Вызов:
Задача проста: с учетом стартовой сетки выведите решенную головоломку.
ПРИМЕЧАНИЕ. Вам не нужно применять вышеуказанные правила. Вы, конечно, можете, и это должно дать вам подсказки о том, как реализовать эту задачу, но грубое решение с учетом правил вполне подойдет.
Как вы решаете это, зависит от вас, но задача состоит в том, чтобы вывести решенную головоломку.
Правила вызова:
- Формат ввода и вывода для сетки является гибким, но, пожалуйста, укажите, что вы используете. (Т.е. 2D байтовый массив; строка с символами новой строки; и т. Д.)
- Это выше также относится к используемым символам. В примере, который я использовал
01.
, но если вы хотите, вы можете использоватьABx
вместо этого. Пожалуйста, укажите, какой формат ввода / вывода и символы вы использовали. - Можно предположить , будет использоваться только следующие размеры сетки:
6x6
;8x8
;10x10
;12x12
;14x14
;16x16
,
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с соответствующими параметрами, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это необходимо.
Тестовые случаи:
Точки добавляются только для удобства чтения, не стесняйтесь использовать пробелы или все, что вы предпочитаете вместо пробелов. Как в, так и в выходном формате является гибким.
Input:
1..0..
..00.1
.00..1
......
00.1..
.1..00
Output:
101010
010011
100101
011010
001101
110100
Input:
.1....
.10.0.
1.11..
.1....
...1.0
......
Output:
011010
010101
101100
010011
100110
101001
Input:
.......1..
.00..0..1.
.0..1..0.0
..1...1...
1.1......1
.......1..
.0..1...0.
....11...0
.0.0..1..0
0...0...1.
Output:
0110010101
1001100110
1001101010
0110011001
1010100101
0101010110
1001101001
0110110100
1010011010
0101001011
источник
Ответы:
Брахилог , 34 байта
Попробуйте онлайн!
Это чертовски медленно, поэтому тестовый пример на TIO 4x4. В настоящее время я запускаю тестовый пример 6x6 на своем компьютере, чтобы узнать, сколько времени это займет.
Это берет список списков в качестве входных данных. Неизвестные значения должны указываться с помощью переменных, то есть со строками в верхнем регистре (и все они должны быть разными, в противном случае вы указали бы, что некоторые ячейки должны иметь одинаковое значение)
объяснение
Мы ограничиваем значения, чтобы быть в
{0,1}
, затем мы пытаемся создавать экземпляры переменных, пока не соблюдаются все 3 правила. Вот почему это так медленно (потому что он будет пробовать все из них, пока не найдет один; и потому, что в этом случае Brachylog не реализован достаточно хорошо, чтобы можно было наложить ограничения перед попыткой возможной матрицы).источник
A
помощью параметра throughY
(сZ
параметром output). Продолжает ли он сAA
,AB
и т.д.?AA
является переменной, аKEVINCRUIJSSEN
также является переменной.JavaScript (ES6),
274270 байтПринимает входные данные в виде двумерного массива, где пустые ячейки отмечены значком
2
. Выводит все возможные решения на консоль.Как это работает
Первая часть кода использует
M()
функцию для проверки правильности текущей доски, как по горизонтали, так и по вертикали.Он отображает полную строку или столбец в строку s . На самом деле это массив, приведенный к строке, поэтому он выглядит следующим образом
"1,2,2,0,2,2"
.Оно использует:
/(0|1),\1,\1/
для обнаружения 3 или более последовательных идентичных цифр.Если доска недействительна, мы немедленно остановимся. Если доска действительна и укомплектована, мы печатаем ее на консоли. В противном случае вторая часть кода пытается заменить каждые 2 на ноль или единицу рекурсивными вызовами:
демонстрация
Показать фрагмент кода
источник
Желе ,
5351 байтПринимает список списков , представляющих сетку, содержащих
0
,1
и2
(пространства). Возвращает список списков списков, каждый список списков имеет один и тот же формат (хотя и без2
s) и представляет возможное решение для ввода.Попробуйте онлайн! (это не будет запускать ни одного из тестовых случаев вопроса из-за ограничений памяти - все 2сетки nSpaces создаются в виде списка списков целых чисел - но я поместил относительно здоровенный случай с одним решением). Нижний колонтитул отделяет и форматирует сетки.
Метод чистой грубой силы - реализует правила и проверяет их для каждой сетки, которая может быть сформирована путем замены любого из
2
s на1
s или0
s.источник