Если вы не знаете, что такое королева в шахматах, это не имеет большого значения; это просто имя :)
Ваш ввод будет квадратом произвольной ширины и высоты, содержащим некоторое количество королев. Плата ввода будет выглядеть так (эта доска имеет ширину и высоту 8):
...Q....
......Q.
..Q.....
.......Q
.Q......
....Q...
Q.......
.....Q..
На этой доске 8 королев. Если бы здесь было, скажем, 7, 1 или 10, доска не была бы действительной.
Здесь мы используем .
для пустого пространства, а Q
для королевы. Вместо этого вы можете использовать любой непробельный символ, какой пожелаете.
Этот ввод может быть проверен как действительный, и вы должны напечатать (или вернуть) истинное значение (если оно недопустимо, вы должны напечатать (или вернуть) ложное значение). Он действителен, потому что ни одна королева не находится в той же строке, столбце, диагонали или антидиагонале, что и другая .
Примеры (не выводите вещи в скобках):
...Q....
......Q.
..Q.....
.......Q
.Q......
....Q...
Q.......
.....Q..
1
...Q.
Q....
.Q...
....Q
..Q..
0
Q.
Q.
0
..Q
...
.Q.
0 (this is 0 because there are only 2 queens on a 3x3 board)
..Q.
Q...
...Q
.Q..
1
Q
1 (this is valid, because the board is only 1x1, so there's no queen that can take another)
Позвольте мне подчеркнуть, что вход действителен только в том случае, если ни одна ферзя не находится в той же строке, столбце, диагонали или антидиагональности, что и другая .
правила
- Вы никогда не получите пустой ввод
- Если вход содержит меньше ферзей, чем квадратный корень области платы, он недействителен.
- Обратите внимание, что для доски 2x2 или 3x3 нет действительных решений, но есть решение для любой другой квадратной доски, где ширина и высота - это натуральное число.
- Ввод может быть в любом разумном формате, согласно правилам PPCG
- Вход всегда будет квадратным
- Я использовал 1 и 0 в примерах, но вы можете использовать любые истинные или ложные значения (такие как
Why yes, sir, that is indeed the case
иWhy no, sir, that is not the case
)
Поскольку это код-гольф , выигрывает самый короткий код!
{(x, y, v)}
сv
в[., Q]
быть допустимым форматом ввода?(0, 0, Q), (0, 1, .), (1, 0, Q), (1, 1, .)
будет третий контрольный пример.Ответы:
Улитки , 14 байт
Попробуйте онлайн!
Ничего похожего на язык соответствия 2D-моделей для решения 2D-задач. :)
объяснение
&
На первой линии является вариантом режима матч , который требует узора на второй линии , чтобы соответствовать из любой возможной позиции на входе. Если это так, программа печатает1
, в противном случае она печатает0
.Что касается самого шаблона, обратите внимание, что
)
в конце есть неявное .Почему это работает легче всего понять, начав с негативного взгляда: убедившись, что нет
Q
прямой линии от другой, которуюQ
мы уже нашли, мы удостоверимся, что существует не более N королев (в противном случае быть двумя в одном ряду, и было бы невозможно найти этих королев, не найдя другую). Затем первая часть, убедившись в том, что королева достижима в ортогональном направлении из любой позиции, гарантирует, что существует ровно N королев. Если бы кто-то отсутствовал, там была бы строка и столбец без королевы. Начиная с их пересечения, невозможно найти королеву, если идти только в ортогональном направлении.источник
Желе , 17 или 15 байт
Попробуйте онлайн!
Использует
‘
для королевы и¹
для пустого пространства. (Это в основном является следствием запрета на использование входных данных в качестве массива, поскольку он заставляет входные данные быть строками; преобразование строк в целые числа затруднено в Jelly, причем самым простым методом является оценка, и получается, что вместо 1 и 0, используя «add 1» (‘
) и «add 0» (¹
), можно опустить несколько команд суммирования и отображения, потому что мы можем подсчитать королев в списке, оценивая его.) Значения truey и falsey являются нормальными для Jelly1
и0
,РЕДАКТИРОВАТЬ: вопрос изменился, так как я написал этот ответ, чтобы позволить принимать входные данные в качестве матрицы. Это позволяет отбрасывать ведущий
Ỵµ
, экономя 2 байта. Это также, вероятно, позволяет изменить формат ввода на что-то более нормальное, используяS
для суммирования, а неV
для оценки, но я не думаю, что это экономит байты, и мне нравится этот классный формат.объяснение
Итак, основная идея заключается в том, что мы гарантируем, что в каждой антидиагонали, диагонали и столбце есть не более одной ферзя; и ровно одна королева в каждом ряду. Этих условий достаточно для того, чтобы на каждом из четырех видов линий было не более одной ферзя, а количество ферзей равнялось длине стороны доски.
Между прочим, Jelly, вероятно, мог бы сделать со встроенным антидиагоналом, но AFAICT, похоже, его не имеет, поэтому мне нужно согласиться на отражение доски и затем взять диагонали.
Еще одно интересное примечание: изменение
=1Ṃ
наE
(все равно) дает обобщенную проверку n- королев, которая также будет принимать доску n × n, где каждая строка, столбец, диагональ и антидиагональ содержит не более k ферзей, а доска содержит ровно кн королев. Ограничение k равным 1 фактически стоит два байта.источник
Октава,
5770675152 байтаСохранено 1 байт с использованием
flip
вместоrot90
@LuisMendo, но обнаружена ошибка в случае 1x1Принимает ввод как двоичную матрицу с 1, представляющим Королеву, и 0, представляющим пустое пространство.
Создает анонимную функцию, которая сначала объединяет матрицу ввода и ее транспонирование.
spdiags
создает матрицу с тем же числом строк, что и аргумент, с диагоналами, превращенными в столбцы (с добавлением нуля по мере необходимости), поэтому объединяютсяspdiags
входной матрицы для получения диагоналей иspdiags
матрицы переворачивается горизонтально для получения антидиагоналей.Теперь возьмите сумму каждого столбца каскадной матрицы и убедитесь, что каждый столбец точно равен 1.
Пробный прогон на идеоне .
источник
flip
вместоrot90
all()
?MATL ,
3834 байта4 байта, благодаря @beaker !
Входные данные представляют собой двумерный массив нулей и единиц, использующий точки с запятой в качестве разделителей строк.
Это выводит вектор столбца единиц как истинный, и вектор столбца, содержащий по крайней мере один ноль как ложный.
Попробуйте онлайн! Код
if
нижнего колонтитула - это ветка, демонстрирующая правду или ложь.Или проверьте все тестовые случаи .
объяснение
источник
J 37 байт
Поезд анонимной функции, который принимает в качестве аргумента булеву матрицу.
Попробуйте онлайн!
(
+/
сумма&
из,
в Равель=
равна#
бирки строк)
*
и (лит. раз)1
один=
равняется[:
на>./
максимум+/
суммы по/.
диагонали,
и (буквально)+/
суммы по/.
диагонали&
на|.
обратной стороне,
и+/
суммы по,
и+/
суммы&
из|:
транспонированнойисточник
SnakeEx , 67 байт
Использует
_
вместо.
ввода. Возвращает 1 или более совпадений для truey, 0 совпадений для falsey. Вы можете найти онлайн переводчика по ссылке в шапке.объяснение
SnakeEx - это язык из задачи 2-D Pattern Matching . Он определяет «змей», которые перемещаются по сетке, сопоставляя вещи. Змеи могут порождать других змей, что делает язык довольно мощным.
Давайте посмотрим на эту программу снизу вверх.
Это определяет змею,
n
которая соответствует 1 или более подчеркиваниям, а затем краю сетки. Обратите внимание, что это может быть в любом из 8 основных направлений - направление определяется, когда появляется змея.Как и
n
выше, это определяетq
змею, которая соответствует любому числу подчеркиваний, одиночномуQ
, любому числу подчеркиваний и краю сетки. Другими словами, строка / столбец / диагональ, в которой есть только одна королева.e
это змея, которая соответствует одному персонажу и краю сетки.Главная змея
m
использует эти строительные блоки, чтобы проверить всю доску. Концептуально, он проходит по внешним краям сетки, порождая других змей, чтобы проверить, что все столбцы и строки имеют ровно одну королеву, а все диагонали имеют не более одной королевы. Если какая-либо из порожденных змей не соответствует, все совпадение не выполняется. Давайте разберемся с этим.( )%{4}
выполняет то, что внутри скобок 4 раза, по одному для каждой стороны. (В дальнейшем полезно изобразить определенную сторону - скажем, верхний край сетки, начиная с верхнего левого угла и двигаясь вправо.){q<>}
порождаетq
змею в том же направлении, в котором движется главная змея. Это подтверждает, что текущий фронт соответствует правилу «ровно одна королева». Обратите внимание, что порожденные змеи не перемещают указатель соответствия главной змеи, поэтому мы все еще в начале края.( )*
соответствует 0 или более из того, что внутри скобок.{q<R>}
порождаетq
змею, повернутую направо от направления главной змеи. (Например, если главная змея движется вправо вдоль верхнего края, эта змея движется вниз.) Это проверяет каждый столбец / строку.[ ]
соответствует одному из вариантов в скобках:{q<RF>}
порождаетq
змею, повернутую на 45 градусов вправо (т.е. вправоR
иF
влево) от направления главной змеи.q
Змея соответствует , если диагональ содержит ровно одну королеву.{n<RF>}
порождаетn
змею вместо этого.n
Змея совпадает , если диагональ не содержит маток..
соответствует любому символу, перемещая указатель соответствия вперед.{e<>}
.<R>
поворачивается главная змея вправо, готовая соответствовать следующему краю.Странные вещи
X
(разветвить во всех диагональных направлениях) вместоRF
. К сожалению, онлайн-переводчик сказал, что это синтаксическая ошибка. Я тоже пытался*
(ответвление во всех направлениях), но это повесил переводчик._*Q?_*$
должно работать для сопоставления "не более одной королевы" в диагонали, но это также повесил интерпретатор. Я предполагаю, что возможность пустых матчей вызывает проблемы.источник
Рубин, 120 байт
Лямбда-функция основана на оригинальной спецификации, которая требует ввода в виде строки.
преобразует Q в комплексные числа и вычитает их друг от друга. Если разница между координатами любых двух королев является горизонтальной, вертикальной или диагональной, увеличение ее до 4-й степени даст действительное число, и расположение будет недействительным.
Неуправляемый в тестовой программе
источник
Python 3 ,
232200155 байтовПопробуйте онлайн!
-32 байта благодаря @beaker, заметившему изменение в спецификациях ввода; Я изменил язык с Python 3 на 2, что позволило мне использовать
input
входные данные как массив строк или массив символьных массивов.-45 байтов благодаря @Leaky Nun
источник
JavaScript (ES6), 115 байт
Ungolfed:
источник
Рубин, 155 байт
Это ужасно читать, поэтому у меня есть чуть менее гольф версия ниже
Это тот же код, но с некоторыми новыми строками, чтобы выделить то, что происходит.
Сам код является анонимной лямбда-функцией, которая принимает массив строк (
x
) в формате["..Q", "Q..", ".Q."]
.Первая строка отображает каждую строку на индекс символа Q в этой строке. Если символа Q нет, он заменяется на -2 1 . Этот новый массив индексов присваивается переменной
y
.Следующая строка упаковывает этот массив индексов, смещая его на единицу (повернуто). Это приводит к массиву пар последовательных индексов.
Следующая строка особенно сложна. Он проходит через каждую из пар индексов и вычитает меньшее из большего. Если это 1 (а мы не на последней паре 2 ), то есть две королевы, которые находятся на одной диагонали, и вставляется значение -2, в противном случае вставляется исходный индекс ферзя в строке ,
Последняя строка суммирует все индексы для каждого и проверяет, является ли это число треугольника для n-1, где n - ширина (или высота) квадрата.
1: -1 было бы моим ходом, но это 1, кроме 0, так что мешало бы проверять диагонали. Отрицательность этого важна, чтобы сделать окончательную сумму неправильной. Я думал о большом числе (с одной цифрой), например, 9, но я не уверен, что это не приведет к неправильной проверке.
2: доска не переворачивается, в
rotate
отличие от функции массива ruby , и если последняя пара отличается на одну, это не имеет значения - это не диагональ.источник
PHP,
137143 байтавдохновленный решением Нейла
принимает входные данные из первого аргумента командной строки; беги с
-r
. Требуется разрыв строки в один байт.На самом деле вы можете использовать любой символ, но
0
для разрыва строки.печатает true (
1
) или false (пустая строка).сломать
источник
Python 3 ,
185176175172171 байтАнонимная функция, принимающая список строк в качестве входных данных.
Python 2 , 175 байт
источник