(Несмотря на более 60 вопросов, помеченных как шахматы , у нас нет простой задачи для n-ферзей.)
В шахматах головоломка N-Queens описывается следующим образом: учитывая n x n
шахматную доску и n
ферзей, расположите ферзей на шахматной доске так, чтобы никакие две королевы не угрожали друг другу. Ниже приведен пример решения n = 8
, заимствованный из Википедии.
Или в рендеринге ASCII:
xxxQxxxx
xxxxxxQx
xxQxxxxx
xxxxxxxQ
xQxxxxxx
xxxxQxxx
Qxxxxxxx
xxxxxQxx
Задача здесь будет заключаться в том, чтобы взять n
и вывести ASCII-представление решения n
головоломки -Queens. Поскольку существует более одного возможного решения (например, как минимум, вращение или отражение), вашему коду нужно только вывести любое допустимое решение.
вход
Один положительное целое число n
с n >= 4
в любом удобном формате . (n = 2 и n = 3 не имеют решений, а n = 1 тривиально, поэтому они исключаются)
Выход
Результирующее ASCII-представление решения головоломки N-Queen, как описано выше. Вы можете выбрать любые два различных значения ASCII для представления пробелов и королев. Опять же, это может быть выведено в любом подходящем формате (одна строка, список строк, массив символов и т. Д.).
правила
- Начальные или завершающие символы новой строки или пробелы являются необязательными, а также пробелы между символами, если сами символы выстроены правильно.
- Вы можете либо использовать алгоритм для вычисления возможных позиций, либо использовать явный стиль решения «ступеньки», в зависимости от того, что лучше для вашего кода.
- Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
- Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
Примеры
n=4
xQxx
xxxQ
Qxxx
xxQx
n=7
xxQxxxx
xxxxxxQ
xQxxxxx
xxxQxxx
xxxxxQx
Qxxxxxx
xxxxQxx
n=10
xxxxQxxxxx
xxxxxxxxxQ
xxxQxxxxxx
xxxxxxxxQx
xxQxxxxxxx
xxxxxxxQxx
xQxxxxxxxx
xxxxxxQxxx
Qxxxxxxxxx
xxxxxQxxxx
Ответы:
MATL ,
333227 байтПопробуйте онлайн!
Полубортовая сила, недетерминированный подход:
Полученное решение является случайным. Если вы снова запустите код, вы можете получить другую допустимую конфигурацию. Время выполнения также является случайным, но самый длинный тестовый случай (
n = 10
) заканчивается в течение 30 секунд в TIO большую часть времени.источник
C, 114 байтов
Напрямую печатает решение за O (1) раз.
источник
n/2
?n-=o=n%2;for(y=n+o;y--;)
вместоo=n%2;n-=o;for(y=0;y<n+o;++y)
Математика, 103
108110117байтов-5 байт для
DuplicateFreeQ
->E!=##&@@@
-7 байт для
ReplacePart[Array[],]
->SparseArray[]
Вернуть 2D-массив. Требуется 2,76 с для расчета
f[6]
и 135 сf[7]
. (В текущей версии,-
становится0
иQ
до1
.Алгоритм аналогичен ответу MATL, но здесь код полностью грубый.
источник
C - 222 байта
Код не мой, а из IOCCC . Надеюсь, я не нарушаю никаких правил. Кроме того, здесь отображаются все решения для N от 4 до 99. Я постараюсь получить ссылку TIO позже.
источник
Желе ,
2421 байтПопробуйте онлайн!
Предполагая, что каждая королева размещается в отдельных строках, нам нужно только найти индексы столбцов, чтобы разместить каждую королеву, чтобы избежать конфликтов, которые можно найти, генерируя случайную перестановку
[1, 2, ..., n]
и проверяя ее.объяснение
источник
Œc€
вместоœc€2
-1?Python 3,
204189 байтПеребор грубой силы по всем перестановкам. Я мог бы удалить * и распечатать список пониманий, но они выглядят ужасно.
Выход:
Слегка разгульный
источник
Befunge, 122 байта
Попробуйте онлайн!
Это более или менее основано на C-решении от orlp .
объяснение
Считайте количество ферзей q из stdin и вычислите две переменные для последующего использования:
n = q - q%2
иhn = n/2
Запустите основной цикл, повторяя r , номер строки, из q до 0, с уменьшением в начале цикла, поэтому первый r is q минус 1.
Рассчитайте смещение ферзя в каждой строке по следующей формуле:
Выведите смещенные пробелы для отступа позиции ферзя для текущей строки, плюс еще один пробел только потому, что это облегчает цикл вывода.
Вывести
Q
для королевы, а затем новую строку, чтобы перейти к следующей строке.Проверьте, что r равно нулю, и в этом случае мы достигли конца доски и можем выйти, в противном случае мы повторим основной цикл снова.
источник
Haskell , 145 байт
Очевидный подход грубой силы:
Попробуйте онлайн!
источник
Сетчатка , 136 байт
Попробуйте онлайн! Порт @ orlp отличный ответ C. Объяснение:
Преобразовать в одинарные, используя пробелы (после пробела есть пробел
*
).Создать
N
строки сN
пробелами a;
, затем0..N-1
пробелами, затем aQ
. Остальные этапы применяются ко всем строкам.Целочисленное деление
N
на 2. (Также оберните результат,:;
чтобы упростить привязку шаблонов.)Если индекс цикла равен
N/2*2
, то просто оставьте столько пробелов.Если
N/2
кратно 3, то возьмите удвоенный индекс цикла плюс один, по модулюN/2*2+1
.В противном случае возьмите удвоенный индекс цикла плюс
(N/2-1)
плюс 3 в нижней половине доски, по модулюN/2*2
.На самом деле выполнить операцию по модулю.
источник
Древесный уголь , 44 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Другой порт превосходного C-ответа @ orlp.
источник
APL (Dyalog Unicode) , 18 байт SBCS
Полная программа подсказки
n
от стандартного ввода. Выводит разделенное пробелами решение в стандартный вывод, используя·
для пустых квадратов и⍟
для королев.Попробуйте онлайн!
⎕CY'dfns'
C op y в «dfns» библиотека⎕
получить ввод от стандартного вводаqueens
найти все действительно уникальные решения Queens (без отражений и поворотов)⊃
выбрать первое решениеисточник
J , 49 байт
Попробуйте онлайн!
Грубая сила путем тестирования всех перестановок длины n .
источник