Учитывая две разные позиции на шахматной доске и тип фигуры, выведите минимальное количество ходов, которое потребуется этой фигуре, чтобы перейти из одной позиции в другую.
правила
Данный кусок может быть королем, королевой, ладьей, рыцарем и епископом. (Этот вход можно принять за любые 5 уникальных символов)
2 позиции можно занять в любом удобном формате,
Example:
a8 b8 c8 d8 ... h8
a7 b7 c7 d7 ... h7
...
...
a1 b1 c1 d1 ... h1
Если кусок не может туда попасть, выведите что-нибудь кроме положительного целого числа.
Примеры
i/p ---- o/p
King
a1,a4 3
a1,h6 7
b3,h5 6
Queen
a1,a4 1
a1,h6 2
b3,f7 1
Rook
a1,a4 1
a1,h6 2
h2,c7 2
Knight
a1,a4 3
a1,h6 4
b2,d3 1
b2,c3 2
b3,c3 3
a1,b2 4
Bishop
a1,a4 -1
a1,h6 2
b2,d3 -1
e1,h4 1
Ответы:
JavaScript (Node.js) ,
183180179 байтПопробуйте онлайн!
Так долго за крайний случай, спасибо Арно за проверку. Рыцарь тест
источник
max
троичным.APL (Dyalog Classic) ,
117107105103989795928987 байтовПопробуйте онлайн!
левый арг имеет тип фигуры: 0 = король, 1 = ферзь, 2 = ладья, 3 = рыцарь, 4 = слон; правый аргумент - матрица координат 2x2, каждая строка представляет позицию; возвращает 0 за недоступность
|-⌿⍵
вычисляет пару [abs (∆x), abs (∆y)](⍎⍺⊃
...)⊣
выбирает выражение из списка "..."; если это функция, она применяется к|-⌿⍵
; если это значение (это происходит только для рыцаря),⊣
обязательно верните его вместо|-⌿⍵
король: max (
⌈/
) от abs ∆-sкоролева: удалить нули (
~∘0
) и считать (≢
) уникальным (∪
)ладья: сумма (
+/
) знаков (монадическая×
; 0 для 0, 1 для положительного)рыцарь:
{⍺∊⍵:0⋄1+⍺∇i/⍨∨⌿2=|×/↑⍵∘.-i←,⍳8 8}/,¨⊂¨↓⍵
- начать с начальной позиции и рекурсивно вычислять поколения ходов рыцаря до тех пор, пока окончательная позиция не окажется в наборе; глубина рекурсииепископ: равны ли паритеты двух ∆-s? (
2=.|⊢
эквивалентно=/2|⊢
) умножить логический результат (0 или 1) на count-unique (≢∘∪
)источник
⍎⍺⊃
. Очень умно.Java (JDK) , 229 байт
Попробуйте онлайн!
Пояснения
Код:
кредиты
источник
Древесный уголь , 108 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Перечислите все 64 квадрата доски в предопределенную пустую переменную списка.
Составьте список списков, первая запись которого представляет собой список, содержащий начальную позицию.
Повторяйте до тех пор, пока последняя запись списка не будет содержать конечную позицию.
Отфильтруйте все позиции на доске, которые являются ходом коня, от любой записи в последней записи списка списков и вставьте этот список в список списков. Это включает в себя ранее посещенные позиции, но мы все равно не интересовались ими, поэтому в конечном итоге мы ищем доску в ширину для определения конечной позиции.
Рассчитайте абсолютную разницу координат между начальной и конечной позициями.
Выберите на основе части ввода.
Если это король, выведите максимальную абсолютную разницу координат.
Если это ферзь, то выведите 2, если две разницы не равны или одно не равно нулю.
Если это ладья, выведите 2, если одно из различий не равно нулю.
Если это слон, то выведите 0, если квадраты имеют противоположную четность, иначе выведите 2, если две разницы не равны.
Если это рыцарь, напечатайте количество петель, взятых, чтобы найти конечную позицию.
источник
Japt , 67 байт
Попробуйте онлайн!
Это был настоящий опыт. Я получил много вдохновения от превосходного Ответа APL . Я подозреваю, что возможно еще много игры в гольф, особенно в коде Найта.
Позиции являются первым вводом в форме
[[x1,x2],[y1,y2]]
. Это должно хорошо работать на[[y1,y2],[x1,x2]]
. Выбор фигуры является вторым входом, с 0 = король, 1 = ферзь, 2 = рыцарь, 3 = ладья, 4 = слон. Обратите внимание, что рыцарь и ладья поменялись местами по сравнению с ответом APL.Объяснение:
источник
á
работа[[1,2][2,1]]
значительно сократилась .á
, хороший!U
подразумевается после@
, поэтому вы можете сохранить два байта в функции рыцаря. Вы также можете начать с@=ã ü;
сохранения другого. (ã
Трюк тоже умный :-))