Вступление
Напишите решатель для головоломок Хитори, используя наименьшее количество байтов.
Вызов
Ваша задача - написать решатель для логических головоломок Hitori (itor と り, слово «один» на японском языке; значение названия игры - «Оставь меня в покое»). Правила следующие:
- Вам представлена n-n-n-сетка ячеек, каждая ячейка содержит целое число от 1 до n (включительно).
- Ваша цель состоит в том, чтобы убедиться, что никакие числа не появляются более одного раза в каждой строке и каждом столбце сетки, удаляя числа из данной сетки, с учетом ограничения, указанного в следующих двух правилах,
- Вы не можете удалить два числа из двух смежных (горизонтально или вертикально) ячеек.
- Все остальные пронумерованные ячейки должны быть связаны друг с другом. Это означает, что любые две оставшиеся пронумерованные ячейки могут быть связаны с кривой, которая состоит исключительно из сегментов, соединяющих соседние оставшиеся числа (по горизонтали или по вертикали). (Спасибо @ user202729 за указание, что это отсутствует)
Я надеюсь, что правила уже ясны. Если что-то неясно в правилах, проверьте страницу Википедии .
Тестовые случаи
Ячейки, из которых удалены числа, обозначены нулями.
Input -> Output
4
2 2 2 4 0 2 0 4
1 4 2 3 -> 1 4 2 3
2 3 2 1 2 3 0 1
3 4 1 2 3 0 1 2
4
4 2 4 3 0 2 4 3
4 1 1 2 -> 4 1 0 2
3 1 2 1 3 0 2 1
4 3 1 3 0 3 1 0
5
1 5 3 1 2 1 5 3 0 2
5 4 1 3 4 5 0 1 3 4
3 4 3 1 5 -> 3 4 0 1 5
4 4 2 3 3 4 0 2 0 3
2 1 5 4 4 2 1 5 4 0
8
4 8 1 6 3 2 5 7 0 8 0 6 3 2 0 7
3 6 7 2 1 6 5 4 3 6 7 2 1 0 5 4
2 3 4 8 2 8 6 1 0 3 4 0 2 8 6 1
4 1 6 5 7 7 3 5 -> 4 1 0 5 7 0 3 0
7 2 3 1 8 5 1 2 7 0 3 0 8 5 1 2
3 5 6 7 3 1 8 4 0 5 6 7 0 1 8 0
6 4 2 3 5 4 7 8 6 0 2 3 5 4 7 8
8 7 1 4 2 3 5 6 8 7 1 4 0 3 0 6
9
8 6 5 6 8 1 2 2 9 8 0 5 6 0 1 2 0 9
5 6 2 4 1 7 9 8 3 5 6 2 4 1 7 9 8 3
5 8 2 5 9 9 8 2 6 0 8 0 5 0 9 0 2 0
9 5 6 6 4 3 8 4 1 9 5 6 0 4 3 8 0 1
1 1 6 3 9 9 5 6 2 -> 0 1 0 3 9 0 5 6 2
1 1 4 7 3 8 3 8 6 1 0 4 7 0 8 3 0 6
3 7 4 1 2 6 4 5 5 3 7 0 1 2 6 4 5 0
3 3 1 9 8 7 7 4 5 0 3 1 9 8 0 7 4 5
2 9 7 5 3 5 9 1 3 2 9 7 0 3 5 0 1 0
Эти тестовые примеры взяты из концептов Puzzles , PuzzleBooks , Concept Is Puzzles , Wikipedia и Youtube соответственно.
Спекуляции
Не нужно беспокоиться об обработке исключений.
Вы можете предположить, что ввод - это всегда правильная головоломка с уникальным решением, и вы можете воспользоваться этим при написании кода.
Это код-гольф , выигрывает наименьшее количество байтов.
4 <= n <= 9 (изначально 16, изменено на 9 по предложению Стьюи Гриффина, также избавляет от некоторых проблем при вводе-выводе)
Вы можете принять ввод и предоставить вывод через любую стандартную форму , и вы можете выбрать формат.
Некоторые предложения для выходного формата (но вы не ограничены этим)
- Вывод окончательной сетки
- Вывод сетки, содержащей все удаленные числа
- Вывести список координат одного из вышеперечисленных
Как обычно, здесь применяются лазейки по умолчанию .
Связанный (вдохновленный этим испытанием): Проверьте, все ли элементы в матрице связаны
Мой последний вызов: продление игры семерок
4 <= n <= 16
, но самый большой контрольный пример дляn=9
. Я предлагаю вам либо опубликоватьn=16
тестовый пример, либо сказать4 <= n <= 9
. Между прочим, хороший вызов :)Ответы:
Haskell , 374 байта
Попробуйте онлайн!
источник
APL (Dyalog Unicode) , 133 байта SBCS
Попробуйте онлайн!
Моя реализация правила № 4 (ячейки должны образовывать один связанный компонент) довольно расточительна, но все же это проходит все тесты в течение 10 секунд на TIO.
Общий алгоритм: сохраните две логические матрицы
b
иw
для ячеек, которые наверняка будут черными и белыми соответственно. Инициализироватьb
как все-ноль. Инициализируйтеw
как 1 только для тех ячеек, у которых есть противоположные совпадающие соседи.Повторять до тех пор ,
b
иw
оседают вниз:добавить к
b
ячейкам, которые находятся на одной линии (горизонтальной или вертикальной) и того же значения, что и ячейка вw
добавить к
w
ближайшим соседям всех ячеек вb
добавить ко
w
всем точкам среза - ячейки, удаление которых делит график не черных ячеек на несколько связанных компонентовНаконец, результат
not(b)
умножается на исходную матрицу.источник
Желе , 62 байта
Использует монадическую ссылку is20n29 пользователя user202729 из другого вопроса.
Полная программа печати представления списка списков.
Работает грубой силой и тупо неэффективно.
Попробуйте онлайн! - 3 на 3, так как слишком мало для запуска даже размера 4 в пределах 60-секундного ограничения TIO!
Как?
источник