Введение
Правила головоломки:
Головоломка 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