Вступ
Правила головоломки:
Головоломка Бінарний (також відомий як Takuzu або Subiku) зрозуміла дуже просто і має лише кілька правил:
Оскільки назва гри є бінарною, це досить очевидно, але ви можете заповнити лише нулі та одиниці.
- Не більше двох однакових цифр можуть розташовуватися вертикально або горизонтально один до одного
- Кожен рядок і кожен стовпець повинні містити рівну кількість нулів і одиниць (це неявно означає, що кожна бінарна гра завжди матиме рівні розміри).
- Не може бути жодних дублюваних рядків і не дублюються стовпці (з точно таким же порядком нулів і одиниць).
Ви можете пограти в гру на сайті www.binarypuzzle.com, якщо хочете.
Тактика:
Завдяки правилу 1, ми завжди можемо заповнити цифру, якщо:
- Вже є дві однакові цифри, вертикально або горизонтально прилеглі один до одного, і в цьому випадку ми можемо заповнити протилежну цифру в обидві сторони. Тобто .11...
→ 0110..
.
- Існують дві однакові цифри по вертикалі або по горизонталі з лише одним проміжком між ними. Тобто .1.1..
→.101..
Зважаючи на правило 1, коли залишилось три проміжки, і ми не можемо мати три сусідні з однієї і тієї ж цифри, ми можемо заповнити один з пропусків. Тобто .0.1.0
→ 10.1.0
(Нам залишається заповнити два, і ми не можемо мати три сусідніх у середині, тому перший проміжок повинен бути а 1
.)
Завдяки правилу 2, ми завжди можемо заповнити залишилися пробіли в рядку або стовпці, якщо половина з них вже заповнена протилежною цифрою. Тобто .1.011
→010011
Завдяки правилу 3, ми завжди можемо заповнити протилежні цифри, якщо залишиться лише дві для вирішення в однаковому порядку. Тобто 101100 & 1..100
→101100 & 110100
Завдяки правилу 3, ми можемо іноді заповнити проміжок, коли три пропуски залишені на рівній впорядкованій лінії. Тобто 010011 & .1.01.
→ 010011 & .1.010
(Тут ми не можемо заповнити а 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