Создать решение судоку CHECKER
Здесь есть куча СОЛВЕРСОВ Судоку, но я хочу, чтобы вы создали решение CHECKER настолько маленьким, насколько это возможно для человека (код-гольф).
Допустимая запись может принимать массив 9x9 в качестве аргумента (передаваемый по ссылке, сериализованный в командной строке, или как вы хотите его принять) или принимать входной файл, состоящий из девяти строк из девяти чисел для окончательной сетки , Смотрите примеры ввода ниже.
Допустимый ввод должен быть цифрами от 10 до 1 (1-9)
Пропущенные, пустые, лишние, нечисловые позиции или позиции с номерами за пределами 1-9 должны быть отклонены как недопустимый ввод, возвращая ненулевой результат, печатая ошибку или оба.
Ваша программа должна проверить, появляется ли каждое число один раз для столбца, один раз для строки и один раз для подсетки 3x3. Если оно прошло, верните «0», а если нет, верните ненулевой результат.
Следует избегать использования внешних ресурсов (веб-сайтов и т. Д.).
Если ваше решение представляет собой отдельную программу, выход с состоянием выхода или печать «0» или ненулевое значение для «Pass» или «Fail», соответственно, это нормально.
Пусть победит самый маленький ответ!
Примеры ввода:
c массив:
int input[9][9]={{1,2,3,4,5,6,7,8,9},
{4,5,6,7,8,9,1,2,3},
{7,8,9,1,2,3,4,5,6},
{2,3,1,5,6,4,8,9,7},
{5,6,4,8,9,7,2,3,1},
{8,9,7,2,3,1,5,6,4},
{3,1,2,6,4,5,9,7,8},
{6,4,5,9,7,8,3,1,2},
{9,7,8,3,1,2,6,4,5}
};
файл:
123456789
456789123
789123456
231564897
564897231
897231564
312645978
645978312
978312645
9 подрешеток:
+---+---+---+
|123|456|789|
|456|789|123|
|789|123|456|
+---+---+---+
|231|564|897|
|564|897|231|
|897|231|564|
+---+---+---+
|312|645|978|
|645|978|312|
|978|312|645|
+---+---+---+
источник
1
или-1
Питон, 103
Я ненавижу судоку.
Как это работает: каждая строка, столбец и блок должны иметь каждое число от 1 до 9. Таким образом, для каждого
0 <= i, j < 9
ячейкаi,j
находится в блоке3*floor(i/3) + floor(j/3)
. Таким образом, существует 243 требования для удовлетворения. Я делаю каждое требование кортежем,((item index,item type number),symbol)
гдеitem index
число от 0 до 8 (включительно),item type number
0,1 или 2 для обозначения строки, столбца или блока соответственно иsymbol
является записьюb[i][j]
.Изменить: я по ошибке не проверил правильные записи. Теперь я делаю.
источник
0
если решение прошло, нетTrue
APL (46)
Это занимает матрицу 9 на 9. Пример 1 можно ввести в TryAPL следующим образом:
Объяснение:
↓⍉⍵
: получить столбцы⍵
,↓⍵
: получить ряды⍵
,3/3⌿3 3⍴Z←⍳9
: создайте матрицу 3 на 3, содержащую числа1
для9
, затем сделайте трижды каждое число в обоих направлениях, задав матрицу 9 на 9 с числами1
для9
обозначения каждой группы,Z∘.=
: для каждого номера,1
чтобы9
сделать битовую маску для данной группы,/∘(,⍵)¨
: и маска⍵
с каждым, давая группы⍵
.∊∘Z¨
: Для каждого суб-массива, содержит ли он число1
к9
,∧/,↑
: взять логическоеand
из всех этих чисел вместе.источник
↓9 9⍴1 3 2⍉3 3 9⍴⍵
эквивалентно,/∘(,⍵)¨↓Z∘.=,3/3⌿3 3⍴Z←⍳9
но довольно короче. Я уверен, что есть даже более короткие формулы.⍪
и выполнить одно разбиение в конце:↓(9 9⍴1 3 2⍉3 3 9⍴⍵)⍪⍵⍪⍉⍵
∊∘Z¨
проверяет, состоит ли каждый вложенный массив (строка, столбец или блок) только из чисел от 1 до 9. Он не проверяет, представлены ли все числа. Вам нужно сделать что-то вродеZ∘.∊
проверки, что каждое число в Z содержится в каждом подмассиве.∧/,↑
можно сократить до∧/∊
. Я сделал, я сделал! ;-)If it passes, return "0" and if not, return a non-zero result.
Java / C # -
183/180181/178173/170 байт(Изменение
boolean
кbool
для C #)отформатирован:
Метод создает массив
u
с 27 битовыми масками, представляющими цифры, найденные в девяти строках, столбцах и квадратах.Затем он выполняет итерацию по всем ячейкам, выполняя операцию
1 << a[x][y]
для создания битовой маски, представляющей цифру, и OR для ее столбца, строки и квадратной битовой маски вместе с ней.Затем он перебирает все 27 битовых масок, гарантируя, что все они в сумме составят 27594 (1022 * 9, 1022 - битовая маска для всех имеющихся цифр 1-9). (Обратите внимание, что в
y
итоге получается 27603, поскольку он уже содержит 9 после двойной петли.)Изменить: случайно оставил в,
%3
что больше не нужно.Редактировать 2: Вдохновленный комментарием Брайса Вагнера, код был сжат еще немного.
источник
питон = 196
Не самый удачный, но идея есть. Наборы довольно полезны.
Совет:
Программа:
источник
n={*range(1,10)}
, но это новее, чем вызов. Вместо этого используйтеset(range(1,10))
как MatrixFrog сказал.Java -
385 306 328260 символовРедактировать: я по глупости неверно истолковал инструкции, что ответом должна была быть полная программа. Так как это может быть только допустимая функция, я переписал и минимизировал ее до функции и переписал свое введение в решение с учетом этого.
Итак, как вызов самому себе, я подумал, что постараюсь сделать наименьшее средство проверки Java-решений.
Для достижения этого я предполагаю, что головоломка судоку будет передана в виде многомерного массива Java, например, так:
Затем у нас есть реальный решатель, который возвращает «0», если верное решение, «1», если нет.
Полностью в гольф:
Удобочитаемый:
Так как же это работает? По сути, я просто создаю свою собственную числовую базу с достаточным разрешением в каждой цифре, поэтому мне нужно всего лишь сделать три числовых сравнения после прохождения головоломки, чтобы узнать, является ли она действительной. Я выбрал базу 49 для этой задачи, но любой базы больше 45 будет достаточно.
(Надеюсь) ясный пример: представьте, что каждая «строка» в загадке судоку представляет собой одну цифру в числе base-49. Мы представим каждую цифру в числе base-49 как число base-10 в векторе для простоты. Итак, если все строки «правильные», мы ожидаем следующее число base-49 (как вектор base-10):
или преобразовать в одно число-10:
1526637748041045
Следуйте аналогичной логике для всех столбцов, и то же самое для «подсетей». Любое значение, встречающееся в окончательном анализе, которое не равно этому «идеальному числу», означает, что решение головоломки недопустимо.
Правка для устранения уязвимости всех 5 и других связанных с этим проблем: я добавляю четвертое число базы 49, основываясь на идее, что в каждой головоломке должно быть по 9 каждого числа. Итак, я добавляю 5 к каждой цифре в числе base-49 для каждого вхождения числа base-10, которое представляет индекс цифры. Например, если есть 10 9 и 9 8, 9 7, 8 6 и 9 других, вы получите число base-49 (как вектор base-10 размера 10, чтобы справиться с переполнением):
Который потерпит неудачу при сравнении с нашим «идеальным» числом base-49.
Мое решение использует преимущества этого математического решения, чтобы избежать как можно большего количества циклов и сравнения. Я просто использую
long
значение для хранения каждого числа base-49 как числа base-10 и использую массив поиска, чтобы получить «факторы» для каждой цифры base-49 во время вычисления значения проверки столбца / строки / подсетки.Поскольку Java не предназначена для того, чтобы быть кратким, осторожность в математической конструкции была единственным способом, который я решил, что я мог бы создать краткую проверку.
Дайте мне знать, что вы думаете.
источник
R 145
Код для игры в гольф (более или менее) можно найти здесь /programming//a/21691541/1201032 .
источник
Haskell (Lambdabot), 65 байт
источник
Perl, 193 байта
Ввод ожидается в виде массива:
Код выхода равен 0, если
@a
это решение, в противном случае1
возвращается.Безголовая версия:
Каждая из 9 строк, 9 столбцов и 9 вложенных массивов помещается в отсортированный массив и проверяется, соответствует ли он массиву
(1..9)
. Число$r
увеличивается для каждого успешного совпадения, которое должно составлять до 27 для правильного решения.источник
J
5254Принимает аргумент, вставленный в командную строку и заканчивающийся символом а):
Возвращает 1, если прошло, 0, если нет.
Внутри он преобразует сетку 9x9 в сетку 3x3x3x3 и выполняет некоторые перестановки на осях, чтобы получить искомую единицу (строки, линии и прямоугольники) в последних двух измерениях.
После этого проверяется, что каждая единица имеет 9 уникальных значений.
Возможно, далеко от совершенства, но уже превосходит большинство ;-)
источник
Mathematica,
8479 символовПримеры:
источник
3
всегда указывает на неверный ввод, или это иногда является ответом на неудачное решение?Javascript ES6, 150 символов
Принимает ввод в виде строки из 81 символа без каких-либо разделителей.
Функция возвращает
null
отрицательный ответ, а массив с исходной строкой в первом элементе - как положительный. Можно изменить на bool, добавив!!
в начало функции.Тест (см. Связанные задачи для более подробно):
источник
R,
6350 байтПредполагается, что входные данные
m
представляют собой матрицу чисел 9x9.Я был прав, что дальнейшая игра в гольф была возможна.
Объяснение:
Возьмите
m
, и для каждой строки применитеmatch
функцию. Мы указываем дополнительный аргументx=1:9
для передачиmatch
.x
является аргументом первой позиции по умолчанию, и поэтому каждая строка помещается во позицию второго аргумента, то естьtable
. Функцияmatch
ищет экземплярыx
вtable
. В этом случае, он ищет1:9
(цифры от 1 до 9) в каждой строке. Для каждого из1:9
он вернетсяTRUE
(илиFALSE
), если этот номер найден (или нет).Таким образом, это приводит к серии из 81 логических значений.
Повторите вышеуказанное для каждого столбца ввода.
Наконец,
all
проверяет, является ли каждый элемент списка логических значенийTRUE
. Это будет иметь место в том и только в том случае, если решение является правильным (то есть каждое число1:9
присутствует только один раз в каждом столбце и каждой строке).Старый подход:Он берет каждый ряд, сортирует его, а затем сравнивает его с[1, 2, ... 9]
. Правильный ряд должен точно соответствовать. Затем он делает то же самое для каждого столбца. Всего у нас должно быть 162 точных совпадения, что и проверяет последняя часть. Здесь, вероятно, есть некоторые возможности для дальнейшего игры в гольф ...источник
Haskell - 175
Эта функция
v
вызывается. Он работает, получая разность каждой строки, столбца и блока по списку[1..9]
и суммируя длины этих списков различий.Демо на примере Судоку:
источник
Javascript - 149 символов
Ожидает существование массива
a
и создает переменнуюo
для вывода, которая0
в случае успеха и не равна нулю в противном случае.Работает, проверяя, что сумма позиции, в которой каждое значение встречается для каждой строки, столбца и сетки 3 * 3, равна 36 (0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8).
тестирование
Дает 'o = 0'
(Последние 2 цифры поменялись местами)
дает
o=-1
дает
o=-284
источник
Haskell,
121130127 байтов (87 Lambdabot)использование:
Lambdabot загружает Data.List и Data.List.Split по умолчанию (я не думаю, что решение BlackCap проверяет флажки).
Идеи по улучшению приветствуются
// Редактировать: я испортил :)
// Редактировать: 3 байта сохранены BlackCap
источник
(map sort)
на(sort<$>)
.c$(sort<$>)<$>
с$(sort<$>)=<<
05AB1E , 36 байт | NoN-Competing |
Попробуйте онлайн!
1 верно, все остальное ложно.
источник
Clojure, 151 байт
Довольно долго, но другие, похоже, тоже. Также раздражает, что объединение множеств требует a
require
, поэтому вместо этого я использовал конкатат векторов.Итерирует по каждой строке и столбцу, и если значение находится в диапазоне от 1 до 9, оно испускает три вектора, один для строки, столбца и ячейки 3х3. Возвращает 0 в случае успеха, в
nil
противном случае два дополнительных символа могут вернуть 1 в случае неудачи. Возвращает числа за пределами 1 - 9, возвращая их,nil
но приводит к сбою при других аномалиях, таких как нецелые значения. Коэффициенты 0 - 2, поэтому можно безопасно использовать значения8
и9
дифференцировать значения ячеек от строк и столбцов.Вход - это вложенный вектор векторов (так что
nth
работает):Ungolfed:
источник
PHP,
196190 байтПрограмма принимает 9 отдельных аргументов командной строки (по одной строке цифр для каждой строки сетки);
выходит с
1
ошибкой (ошибка),0
(ок) для действительного.Беги с
php -nr '<code>' <row1> <row2> ...
.сломать
объяснение
count_chars
считает символы в строке и обычно создает массив с кодами ascii в качестве ключей и количеством символов в качестве значений; но с3
параметром mode он создает отсортированную строку из символов; и это можно легко сравнить с числом с нужными цифрами.Сравнение не только проверяет дубликаты, но также включает проверку на недопустимые символы. И это только требует
<
, а не!=
потому, что это числовое сравнение: PHP будет интерпретировать строку как число, насколько это возможно.123e56789
,0x3456789
Или подобное не может появиться, потому что символы сортируются; и любое чистое целое число с отсутствующей цифрой меньше чем123456789
... и.23456789
тоже, конечно.$a=$argv
сохраняет один байт,$d=123456789
сохраняет девять и$u=count_chars
сохраняет 13.источник
C # -
306298288 символовСледующая консольная программа использовалась для вызова функции проверки;
Все, что это делает, это инициализирует массив и передает его в функцию проверки P.
Функция проверки указана ниже (в форме для игры в гольф);
Или в полностью разложенном виде;
При этом используется идея, что все столбцы, строки и подрешетки должны составлять до 45. Он работает через входной массив и вычитает значение каждой позиции из его строки, столбца и подсетки. После завершения он проверяет, что ни одна из строк, столбцов или подрешеток не имеет значения.
По запросу возвращает 0, если массив является допустимым решением Судоку, и ненулевое (1), где это не так.
источник
private static int P(int[,]i){int[]r=new int[9],c=new int[9],g=new int[9];
вместо этого. (Обратите внимание на удаление пробела после закрывающей квадратной скобки]
.) Кроме того, я не уверен, но я думаю, что вы можете избавиться отprivate static
.for(int p=0;p<9;p++)if(r[p]>0|c[p]>0|g[p]>0)return 1;return 0;}
не уверены, работает ли он в C #. (Я на самом деле не знаю C #)