Вызов:
Учитывая стандартную доску судоку, найдите минимальное количество добавленных номеров, чтобы сделать доску уникальной.
Специфические / Правила:
Ввод отформатирован следующим образом (все пробелы являются значительными)
516|827|943 278|394|615 349|615|872 ---+---+--- 98 |4 2|156 465|189|237 12 |5 6|489 ---+---+--- 892|743|561 634|951|728 751|268|394
Выходные данные отформатированы по одному числу в строке, отформатированы как
(x,y):z
- x и y начинаются с единицы слева вверху и увеличиваются вниз и вправо; z - это число, которое будет добавлено.- В этом случае они бы все действительные результаты:
(3,4):3
,(3,4):7
,(5,4):3
,(5,4):7
,(3,6):3
,(3,6):7
,(5,6):3
, и(5,6):7
, как и любой один из них позволил бы совет , чтобы решить.
- В этом случае они бы все действительные результаты:
- Если введена уникальная / решенная доска Судоку, программа не должна ничего печатать, даже перевод строки.
- Программа должна быть запущена менее чем за час для любой доски (я советую тестировать, используя полностью пустую доску или доску с одним случайным числом на ней ...).
Подсчет очков:
- Возьмите ваш общий размер кода (в гольфе) в символах, включая все пробелы ...
Бонусы:
Размер кода 1/2 : если программа печатает один восклицательный знак и останавливается при появлении доски без введенных решений.
Размер кода 1/2 : если программа печатает два восклицательных знака и останавливается после ввода доски с внутренним противоречием (два числа одинаковы в одной строке / столбце / квадрате).
Ответы:
Брахилог , 245 байт / 2 = 122,5
(Обратите внимание, что вы должны использовать версию языка на момент этого коммита . Для корректной работы этого кода в следующих версиях Brachylog потребуется несколько небольших изменений)
Он печатается,
"!!"
если у данной доски есть внутренние противоречия (однако в этом случае это займет несколько секунд на TIO, так что наберитесь терпения).Я не уверен, что правильно понял первый бонус, поэтому не обращаюсь к нему.
Это явно не конкурирует, так как язык гораздо более свежий, чем проблема, однако, поскольку нет других ответов, я не уверен, что это имеет большое значение…
объяснение
Основной предикат:
Предикат 1: Удалить все "
|
" в строках, преобразовать---+---+---
в,-
чтобы удалить их послеПредикат 2: Преобразовать один символ в целое число или, если он пуст, в переменную от 1 до 9.
Предикат 3: установить, что все значения входного списка ячеек должны быть разными
Предикат 4. Применение ограничения различимости к значениям в 3 * 3 блоках.
Предикат 5:
Предикат 6: Назначьте значения, удовлетворяющие ограничениям, подмножеству пустых ячеек, тогда с этими значениями существует только одно решение для доски.
Предикат 7: Преобразует доску так, что каждая ячейка теперь
[V:X:Y]
вместо единственнойV
(значение).Предикат 8: трансформирует линию так, чтобы каждая ячейка была теперь
[V:X]
.Предикат 9: Получить значения ячеек
Предикат 10: Добавить длину подмножества в начале
Предикат 11: Распечатать одну ячейку
источник