Это лунка -3 с осеннего турнира APL CodeGolf . Я являюсь первоначальным автором этой проблемы, и поэтому мне разрешено повторно публиковать ее здесь.
Данный:
количество ходов (пожалуйста, укажите, если нет движений 0, в противном случае мы будем считать, что он называется 1) и
список одной или нескольких начальных позиций (в любой форме, например, 0 или 1 индексированные координаты или 64 последовательных числа / символа или A1 – H8 - состояние, которое), на шахматной доске 8 на 8,
вернуть (в любом порядке) список уникальных позиций (в том же формате, что и входные данные), в которых рыцари могут находиться после заданного количества ходов.
Каждый рыцарь должен двигаться с каждым ходом, но вам не нужно беспокоиться о том, что несколько рыцарей занимают один и тот же квадрат.
Рыцарь может двигаться только в позиции, отмеченные X, относительно его текущей позиции, отмеченной ♞:
Примеры (1-индексированные координаты)
1
перейти от [[1,1]]
: [[2,3],[3,2]]
2
движется от [[1,1]]
: [[1,1],[1,3],[1,5],[2,4],[3,1],[3,5],[4,2],[4,4],[5,1],[5,3]]
1
перейти от [[1,1],[5,7]]
: [[2,3],[3,2],[3,6],[3,8],[4,5],[6,5],[7,6],[7,8]]
2
движется от [[1,1],[5,7]]
: [[1,1],[1,3],[1,5],[1,7],[2,4],[2,6],[2,8],[3,1],[3,3],[3,5],[3,7],[4,2],[4,4],[4,6],[4,8],[5,1],[5,3],[5,5],[5,7],[6,4],[6,6],[6,8],[7,3],[7,7],[8,4],[8,6],[8,8]]
0
движется от [[3,4]]
: [[3,4]]
источник
[[1,1]], 2 -> [[2,3],[3,2]]
Ответы:
Wolfram Language (Mathematica) , 45 байт
Поскольку другое решение неверно (см. Комментарий Мартина ниже), поэтому я решил опубликовать свое решение:
Попробуйте онлайн!
Конечная нотация инфикса ...
Принимает 2 входа, первый список номеров в диапазоне
[1,64]
описывающих начальные позиции коня, второе - количество шагов.Это решение основано на исключительном удобстве встроенных функций Mathematica:
AdjacencyList
Может взять список вершин на правой стороне и вернуть список вершин, смежных с любой из них, уже удаленных дубликатов и отсортированных .KnightTourGraph
является встроенным Не удивительно.Nest
принимает аргументы в порядкеNest[f, expr, n]
, который мы можем разделить на##
его правой стороне какNest[f, ##]
.a~b~c~d~e
как(a~b~c)~d~e
, так что квадратная скобка не нужна. Без инфиксной нотации и сглаживания##
это было быNest[AdjacencyList[KnightTourGraph[8, 8], #] &, #, #2]&
.источник
JavaScript (ES7), 99 байт
Формат ввода / вывода: квадратные индексы в [0 ... 63] .
Контрольные примеры
Этот фрагмент содержит две вспомогательные функции для перевода из и в формат, предоставленный OP.
Показать фрагмент кода
Как?
Переход от (x, y) к (X, Y) является допустимым ходом коня, если мы имеем:
Используя квадрат вместо использования абсолютных значений, это можно выразить как:
Поскольку 1 и 4 являются единственными идеальными квадратами, которые дают 5, когда XOR'ы вместе, у нас есть правильный ход коня, если:
(xX) ² XOR (yY) ² XOR 5 = 0
Мы применяем эту формулу к каждому квадрату p = 8y + x на доске и каждому квадрату рыцаря P = 8Y + X, чтобы вывести новые возможные квадраты цели рыцаря, и рекурсивно повторяем этот процесс n раз.
источник
Октава, 69 байт
Демо онлайн!
Вход / выход - это конфигурация платы в начале / конце в виде двоичной матрицы 8 * 8.
Объяснение:
Для
n
шагов повторите морфологическое расширение доски со следующей маской:источник
Сетчатка ,
147102 байтаПопробуйте онлайн! Вводит в виде доски 8x8
:
s с конями, помеченнымиN
s, с цифрой для числа ходов на следующей строке (нет смысла иметь больше 9 ходов, но если вы настаиваете, я могу поддержать его для дополнительного байт). Обратите внимание, что вывод содержит дополнительный пробел. Редактировать: 45 байтов сохранено благодаря @MartinEnder. Объяснение: На первом этапе число витков преобразуется в унарный, но с использованием символов табуляции, чтобы впоследствии они не попали под случайное совпадение, а на втором этапе справа от поля добавляются пробелы, чтобы регулярные выражения не переносились через край. Третий этап заменяет всеN
s и:
s, которые являются ходом рыцаря от aN
сn
то время как четвертый этап удаляет все оставшиесяN
s, изменяетn
s кN
s, и вычитает 1 из числа ходов. Это повторяется до тех пор, пока счетчик ходов не станет равным нулю.источник
Желе , 29 байт
Попробуйте онлайн!
0-индексированные координаты. Почти наверняка это неоптимально.
-1 байт благодаря пользователю 202729
объяснение
источник
Ç
.05AB1E ,
2725 байтовБлагодаря Эмигне за сохранение 2 байта!
Использует 1-индексированные координаты.
Код:
Использует кодировку 05AB1E . Попробуйте онлайн!
Объяснение:
Это дает нам следующий массив:
Какие дельты ходов рыцаря.
источник
•eĆ•SÍü‚
вместо того,Ƶ‡4в2ô<D(«
чтобы сохранить 2 байта.Python 3, 105 байт
Приходится использовать именованную лямбду для рекурсии. Не уверен, что это дисквалифицирует. Перейдите в стартовые позиции в виде списка 0-индексированных квадратных чисел. 0 считается как без ходов.
источник
Java (OpenJDK 8) , 124 байта
Попробуйте онлайн!
Формат ввода / вывода
Ввод / вывод представлен в виде битов в
long
(64 бита): установленные биты означают наличие лошади, неустановленные биты означают отсутствие лошади. Пример:Пояснения
кредиты
(X-x)²+(Y-y)²==5
трюк из ответа Арнаулда на JavaScriptint[]
64-битного режимаlong
.источник
(m,p)->{for(;m-->0;){int i=64,a[]=p,x,y,u[]={1,3,5,9,15,19,21,23};for(p=new int[i];i-->0;)for(int z:u)if((((x=i/8+z/5-2)|(y=i%8+z%5-2))&-8)==0)p[x*8+y]|=a[i];}return p;}
(m,p)->{for(int i,j,a[],x;m-->0;)for(a=p,p=new int[i=64];i-->0;)for(j=64;j-->0;)p[j]|=(x=i%8-j%8)*x+(x=i/8-j/8)*x==5?a[i]:0;return p;}
int[]
наlong
:(m,p)->{for(long i,j,a;m-->0;)for(a=p,p=i=0;i<64;i++)for(j=64;j-->0;)p|=(p=i%8-j%8)*p+(p=i/8-j/8)*p==5?(a>>i&1)<<j:0;return p;}
Желе ,
2928 байтПопробуйте онлайн!
Количество ходов через STDIN, а квадраты - аргумент.
Это связывает решение Jelly от HyperNeutrino, но с другим подходом.Теперь бьем @HyperNeutrino на 1 байт!
Любые предложения выбить некоторые байты нужны!
Ссылка 1 (Шахматная доска)
Ссылка 2 (Поколение движения)
Ссылка 3 (проверка квадрата)
источник
Шелуха , 18 байт
Используется индексирование квадратов и шагов на основе 1. Попробуйте онлайн!
объяснение
источник
R ,
145183134 байтЭто результат отличной игры в гольф Джузеппе с моим первоначальным алгоритмом не слишком для игры в гольф (см. Комментарий ниже)
Попробуйте онлайн!
Вход и выход основаны на 1 ... 64. Занимает вектор положения с использованием нотации 1 ... 64. Сопоставляет его с нотацией 1: 576, которая представляет собой суперплату из девяти досок. В этой нотации на каждой итерации каждый рыцарь должен иметь возможность двигаться на +/- 22,26,47,49. Вернуть будущие позиции обратно в нотацию 1 ... 64, исключая те, которые падают с центральной доски. Пример TIO отображает результат с использованием матрицы 8x8.
источник
[0...63]
вместо этого вы берете его в нотации.[1..64]
для ввода и вывода. +1, тем не менее, это отличный ответ.