В шахматах Рыцарь на сетке (x, y) может перейти к (x-2, y-1), (x-2, y + 1), (x-1, y-2), (x-1, y + 2), (x + 1, y-2), (x + 1, y + 2), (x + 2, y-1), (x + 2, y + 1) за один шаг. Представьте себе бесконечную шахматную доску, на которой только Рыцарь (0, 0):
Сколько шагов требуется для перемещения Рыцаря из (0, 0) в (t x , t y )?
входные
Два целых числа: t x , t y ;
-100 <t x <100, -100 <t y <100
Выход
Минимальные шаги, необходимые для перемещения Рыцаря с (0, 0) на (t x , t y ).
правила
- код гольф
Testcases
x y -> out
0, 0 -> 0
0, 1 -> 3
0, 2 -> 2
1, 1 -> 2
1, 2 -> 1
3, 3 -> 2
4, 0 -> 2
42, 22 -> 22
84, 73 -> 53
45, 66 -> 37
99, 99 -> 66
-45, -91 -> 46
-81, 1 -> 42
11, -2 -> 7
document.write('<div>');[..."EFEDEDCDCBCBCBCBCBCBCBCBCBCBCBCBCBCDCDEDEFE;FEDEDCDCBCBABABABABABABABABABABABCBCDCDEDEF;EDEDCDCBCBABABABABABABABABABABABABCBCDCDEDE;DEDCDCBCBABA9A9A9A9A9A9A9A9A9A9ABABCBCDCDED;EDCDCBCBABA9A9A9A9A9A9A9A9A9A9A9ABABCBCDCDE;DCDCBCBABA9A9898989898989898989A9ABABCBCDCD;CDCBCBABA9A989898989898989898989A9ABABCBCDC;DCBCBABA9A98987878787878787878989A9ABABCBCD;CBCBABA9A9898787878787878787878989A9ABABCBC;BCBABA9A989878767676767676767878989A9ABABCB;CBABA9A98987876767676767676767878989A9ABABC;BABA9A9898787676565656565656767878989A9ABAB;CBA9A989878767656565656565656767878989A9ABC;BABA98987876765654545454545656767878989ABAB;CBA9A987876765654545454545456567678789A9ABC;BABA98987676565454343434345456567678989ABAB;CBA9A987876565454343434343454565678789A9ABC;BABA98987676545434323232343454567678989ABAB;CBA9A987876565434323232323434565678789A9ABC;BABA98987676545432341214323454567678989ABAB;CBA9A987876565434321232123434565678789A9ABC;BABA98987676545432323032323454567678989ABAB;CBA9A987876565434321232123434565678789A9ABC;BABA98987676545432341214323454567678989ABAB;CBA9A987876565434323232323434565678789A9ABC;BABA98987676545434323232343454567678989ABAB;CBA9A987876565454343434343454565678789A9ABC;BABA98987676565454343434345456567678989ABAB;CBA9A987876765654545454545456567678789A9ABC;BABA98987876765654545454545656767878989ABAB;CBA9A989878767656565656565656767878989A9ABC;BABA9A9898787676565656565656767878989A9ABAB;CBABA9A98987876767676767676767878989A9ABABC;BCBABA9A989878767676767676767878989A9ABABCB;CBCBABA9A9898787878787878787878989A9ABABCBC;DCBCBABA9A98987878787878787878989A9ABABCBCD;CDCBCBABA9A989898989898989898989A9ABABCBCDC;DCDCBCBABA9A9898989898989898989A9ABABCBCDCD;EDCDCBCBABA9A9A9A9A9A9A9A9A9A9A9ABABCBCDCDE;DEDCDCBCBABA9A9A9A9A9A9A9A9A9A9ABABCBCDCDED;EDEDCDCBCBABABABABABABABABABABABABCBCDCDEDE;FEDEDCDCBCBABABABABABABABABABABABCBCDCDEDEF;EFEDEDCDCBCBCBCBCBCBCBCBCBCBCBCBCBCDCDEDEFE"].forEach(c=>document.write(c==';'?'<br>':`<span class="d-${c}">${c}</span>`));
document.write('<style>body{line-height:16px;color:rgba(255,255,255,0.2);}span{display:inline-block;width:16px;font-size:16px;text-align:center;}div{white-space:pre;}');[...'0123456789ABCDEF'].map((c,i)=>document.write(`.d-${c}{background:hsl(${60-4*i},80%,${65-2*i}%)}`));
Родственный OEIS
Вот некоторые OEIS для дальнейшего чтения
- A018837 : Количество шагов, которое должен достичь рыцарь (n, 0) на бесконечной шахматной доске.
- A018838 : Количество шагов, которое должен достичь рыцарь (n, n) на бесконечной шахматной доске.
- A065775 : Массив T, читаемый по диагонали: T (i, j) = наименьшее количество ходов коня на шахматной доске (бесконечно во всех направлениях), необходимое для перехода от (0,0) к (i, j).
- A183041 : Наименьшее количество ходов коня от (0,0) до (n, 1) на бесконечной шахматной доске.
x+yi
?Ответы:
Wolfram Language (Mathematica) , 64 байта
Использование встроенного
KnightTourGraph
.Сохранено 2 байта благодаря Mathe172 .
Попробуйте онлайн!
источник
GraphDistance[KnightTourGraph@@({x,y}=Abs@{##}+5),2y+3,(x-2)y-2]&
JavaScript (ES6),
907572 байтаВдохновлен формулой, приведенной для A065775 . Медленно, как ад для (не очень) больших расстояний.
Попробуйте онлайн!
Как?
Мы определяем z как побитовое ИЛИ между x и y .
Шаг 1
Сначала мы гарантируем, что мы находимся в определенном квадранте, заставляя и x и y быть неотрицательными. Пока z <0 (что означает, что x или y отрицательны), мы обрабатываем рекурсивный вызов f (-y, x) :
Шаг 2
В то время как у нас z> 1 (что означает, что x или y больше 1 ), мы рекурсивно пробуем два хода, которые приближают нас к (0, 0) : f (x-1, y-2) и f ( х-2, у-1) . Мы в конечном итоге держим кратчайший путь.
Шаг 3
Когда z меньше или равно 1 , у нас остается 3 возможности, которые обрабатываются
z*3^x&y
(мы могли бы использоватьz*3-x*y
вместо):x & y == 1 подразумевает x | y == 1 и означает, что x = y = 1 . Нам нужно еще два хода, чтобы достичь (0, 0) :
х & у == 0 и х | y == 1 означает, что у нас либо x = 1 / y = 0, либо x = 0 / y = 1 . Нам нужно еще три хода, чтобы достичь (0, 0) :
х & у == 0 и х | y == 0 означает, что у нас уже есть x = y = 0 .
Графика позаимствована у chess.com
источник
Python 3 , 90 байт
Спасибо ТШ за -11 байт!
def f(x,y):x=abs(x);y=abs(y);s=x+y;return(.9+max(x/4,y/4,s/6)-s/2+(s==1or x==y==2))//1*2+s
Попробуйте онлайн!
(встроенное форматирование кода, чтобы читателям не приходилось прокручивать. Извините, но я должен сыграть в гольф мою программу)
Очень очень эффективный
Как я мог придумать это?
1. Соотношение
Предполагается, что вся доска окрашена в шахматном порядке (то есть клетки с
x+y
нечетными иx+y
четными окрашены в разные цвета).Обратите внимание, что каждый шаг должен прыгать между двумя разноцветными ячейками. Следовательно:
x+y
.2. Аппроксимация
Предполагается, что рыцарь начинает с координаты
(0,0)
и прошелn
шаги, и в данный момент находится на(x,y)
.Для простоты предполагается
x ≥ 0
, чтоy ≥ 0
.Мы можем заключить:
x
увеличивается не более чем на2
,x ≤ 2×n
. Точно так жеy ≤ 2×n
.x+y
увеличивается не более чем на3
,x+y ≤ 3×n
.Поэтому
n ≥ l(x,y)
гдеl(x,y) = max(max(x,y)/2, (x+y)/3
. (обратите внимание, что нам не нужно включать-x
илиx-y
в формулу, потому что, по предположениюx ≥ 0 and y ≥ 0
, такx+y ≥ max(x-y,y-x,-x-y)
иx ≥ -x
,y ≥ -y
)Оказывается,
a(x,y) = round(0.4 + l(x,y))
это хорошее приближение кn
.Предположим,
a(x,y)
что это приближение с ошибкой меньше, чем1
правильное значение(округлить при вычитании
x+y
и делении на 2)3. Особые случаи, которые не соответствуют формуле
Предположим
x ≥ 0
иy ≥ 0
. В двух особых случаях сбой алгоритма:x == 1 and y == 0
илиx == 0 and y == 1
: алгоритм неверно возвращает, в1
то время как правильный ответ3
.x == y == 2
: Алгоритм неверно возвращает,2
пока правильный ответ4
.Так что, просто особые случаи. Добавьте результат,
2
если значениеx
иy
являются одним из них.источник
x==y==0
тоже так.max(x+y,x-y,y-x)
?x ≥ 0
иy ≥ 0
".Python 2 , 87 байт
Попробуйте онлайн!
Принимает ввод как комплексное число
z = complex(tx, ty)
.источник
TI-Basic,
8654 байтаНа основе более старого решения @ user202729
источник
MATL , 29 байт
Ввод представляет собой комплексное число с целыми действительными и мнимыми частями.
Код очень неэффективен. Требования к памяти увеличиваются экспоненциально с выходом. Время ожидания в TIO для тестовых случаев превышает 7.
Попробуйте онлайн!
источник
Haskell,
7972 байтаПопробуйте онлайн!
Принимает ввод как единый список пар чисел.
Простая грубая сила. Требуется много времени и памяти для результатов> 8. Начиная с одного списка координат элемента (вход), многократно добавляйте все позиции, которые могут быть достигнуты для каждого элемента, пока не появится
(0,0)
в этом списке. Следите за уровнем рекурсии и возвращайте его как результат.Изменить: -7 байт благодаря @Lynn.
источник
JavaScript (ES6),
9078 байтРедактировать: Сохранено 12 байтов благодаря @supercat, указывающему, что
x<0
подразумевает либо либо,y<0
либоx<y
. Пояснение: Это рекурсивное решение. Первые два условия просто обеспечивают правильный квадрант для других условий. Третье условие генерирует ответ для координат около начала координат, в то время как последние два условия относятся к двум другим особым случаям (на 1 байт меньше, чем проверка обоих ходов):Все отмеченные квадраты
+
можно определить, двигаясь прямо к началу координат, а затем повторяя.источник
x<0
тест? Если, например, -3,6, тоx<y
тест превратится в 6, -3, из которогоy<0
тест превратится в 6,3, аx<y
тест - в 3,6.x>=y>=0
...Котлин ,
148146140 байтПопробуйте онлайн!
источник
:Int
указывать тип возвращаемого значения.Желе ,
27262523 байтаПопробуйте онлайн!
Очень медленно; Тайм-аут на TIO для выходов более 6. Принимает комплексное число в качестве ввода.
объяснение
Код использует комплексные числа, потому что он был короче на промежуточном этапе, и он также кажется намного быстрее; Вы можете также использовать пары путем удаления
Æi
и замены0
с0,0
на второй линии.источник