Aux échecs, un chevalier sur la grille (x, y) peut se déplacer vers (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) en une seule étape. Imaginez un échiquier infini avec seulement un chevalier (0, 0):
Combien d'étapes faut-il pour déplacer un chevalier de (0, 0) à (t x , t y )?
Contributions
Deux entiers: t x , t y ;
-100 <t x <100, -100 <t y <100
Sortie
Pas minimum pour déplacer un chevalier de (0, 0) à (t x , t y ).
Règles
- golf de code
Cas de test
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 apparenté
Voici quelques OEIS pour plus de lecture
- A018837 : Nombre d'étapes que le chevalier peut atteindre (n, 0) sur l'échiquier infini.
- A018838 : Nombre de marches à atteindre par le chevalier (n, n) sur l'échiquier infini.
- A065775 : Tableau T lu par des diagonales: T (i, j) = nombre minimum de mouvements de chevalier sur un échiquier (infini dans toutes les directions) nécessaires pour passer de (0,0) à (i, j).
- A183041 : Le plus petit nombre de mouvements de chevalier de (0,0) à (n, 1) sur l'échiquier infini.
x+yi
?Réponses:
Wolfram Language (Mathematica) , 64 octets
Utilisation du intégré
KnightTourGraph
.Enregistré 2 octets grâce à Mathe172 .
Essayez-le en ligne!
la source
GraphDistance[KnightTourGraph@@({x,y}=Abs@{##}+5),2y+3,(x-2)y-2]&
JavaScript (ES6),
907572 octetsInspiré par la formule donnée pour A065775 . Lent comme l'enfer pour (pas si) de longues distances.
Essayez-le en ligne!
Comment?
Nous définissons z comme OR au niveau du bit entre x et y .
Étape 1
Nous nous assurons d'abord que nous sommes situés dans un quadrant spécifique en forçant x et y à être non négatifs. Tant que z <0 (ce qui signifie que x ou y est négatif), nous traitons l'appel récursif f (-y, x) :
Étape 2
Alors que nous avons z> 1 (ce qui signifie que x ou y est supérieur à 1 ), nous essayons récursivement les deux mouvements qui nous rapprochent de (0, 0) : f (x-1, y-2) et f ( x-2, y-1) . Nous gardons finalement le chemin le plus court.
Étape 3
Lorsque z est inférieur ou égal à 1 , il nous reste 3 possibilités qui sont traitées avec
z*3^x&y
(nous pourrions utiliser à laz*3-x*y
place):x & y == 1 implique x | y == 1 et signifie que x = y = 1 . Nous avons besoin de deux mouvements supplémentaires pour atteindre (0, 0) :
x & y == 0 et x | y == 1 signifie que nous avons soit x = 1 / y = 0 ou x = 0 / y = 1 . Nous avons besoin de trois mouvements supplémentaires pour atteindre (0, 0) :
x & y == 0 et x | y == 0 signifie que nous avons déjà x = y = 0 .
Graphiques empruntés à chess.com
la source
Python 3 , 90 octets
Merci tsh pour -11 octets!
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
Essayez-le en ligne!
(formatage de code en ligne pour éviter aux lecteurs d'avoir à faire défiler. Désolé, mais je dois jouer à mon programme)
Très très efficace.
Comment pourrais-je trouver ça!?
1. Parité
Suppose que toute la planche est colorée dans le motif en damier (c'est-à-dire que les cellules
x+y
impaires etx+y
paires sont colorées avec des couleurs différentes).Notez que chaque étape doit sauter entre deux cellules de couleurs différentes. Par conséquent:
x+y
.2. Approximation
Suppose que le chevalier commence à partir des coordonnées
(0,0)
, a déplacé desn
pas et se trouve actuellement à(x,y)
.Par souci de simplicité, suppose
x ≥ 0
,y ≥ 0
.On peut conclure:
x
augmente d'au plus2
,x ≤ 2×n
. De même,y ≤ 2×n
.x+y
augmente d'au plus3
,x+y ≤ 3×n
.Par conséquent,
n ≥ l(x,y)
oùl(x,y) = max(max(x,y)/2, (x+y)/3
. (notez que nous n'avons pas besoin d'inclure-x
oux-y
dans la formule parce que par hypothèse,,x ≥ 0 and y ≥ 0
ainsix+y ≥ max(x-y,y-x,-x-y)
etx ≥ -x
,y ≥ -y
)Il s'avère que
a(x,y) = round(0.4 + l(x,y))
c'est une bonne approximation den
.Supposons qu'il
a(x,y)
s'agit d'une approximation avec une erreur inférieure à1
, la valeur correcte est donnée par(arrondir sous soustraire
x+y
et diviser par 2)3. Cas particuliers qui ne respectent pas la formule
Supposons
x ≥ 0
ety ≥ 0
. Il y a 2 cas particuliers où l'algorithme échoue:x == 1 and y == 0
oux == 0 and y == 1
: l'algorithme renvoie incorrectement1
alors que la bonne réponse est3
.x == y == 2
: L'algorithme renvoie incorrectement2
alors que la bonne réponse est4
.Donc, juste cas particulier ceux-là. Ajoutez le résultat par
2
si la valeur dex
et eny
fait partie.la source
x==y==0
aussi.max(x+y,x-y,y-x)
?x ≥ 0
ety ≥ 0
".Python 2 , 87 octets
Essayez-le en ligne!
Prend l'entrée comme un nombre complexe
z = complex(tx, ty)
.la source
TI-Basic,
8654 octetsBasé sur l'ancienne solution de @ user202729
la source
MATL , 29 octets
L'entrée est un nombre complexe avec des parties réelles et imaginaires entières.
Le code est très inefficace. Ses besoins en mémoire augmentent de façon exponentielle avec la sortie. Il expire dans TIO pour les cas de test avec une sortie supérieure à 7.
Essayez-le en ligne!
la source
Haskell,
7972 octetsEssayez-le en ligne!
Prend l'entrée comme une liste singleton de paires de nombres.
Une force brute simple. Nécessite beaucoup de temps et de mémoire pour les résultats> 8. En commençant par une seule liste d'éléments de coordonnées (l'entrée), ajoutez à plusieurs reprises toutes les positions qui peuvent être atteintes pour chaque élément jusqu'à
(0,0)
soit dans cette liste. Gardez une trace du niveau de récursivité et renvoyez-le comme résultat.Edit: -7 octets grâce à @Lynn.
la source
JavaScript (ES6),
9078 octetsEdit: 12 octets enregistrés grâce à @supercat qui
x<0
indique que cela implique soity<0
oux<y
. Explication: Il s'agit d'une solution récursive. Les deux premières conditions assurent simplement le bon quadrant pour les autres conditions. La troisième condition génère la réponse pour les coordonnées proches de l'origine, tandis que les deux dernières conditions traitent des deux autres cas spéciaux (1 octet de moins que le test des deux mouvements):Tous les carrés marqués
+
peuvent être déterminés en se déplaçant directement vers l'origine, puis en revenant.la source
x<0
test? Étant donné, par exemple, -3,6, lex<y
test transformerait cela en 6, -3, que ley<0
test transformerait en 6,3, que lex<y
test transformerait en 3,6.x>=y>=0
...Kotlin ,
148146140 octetsEssayez-le en ligne!
la source
:Int
de spécifier le type de retour.Gelée ,
27262523 octetsEssayez-le en ligne!
Très lent; expire sur TIO pour les sorties supérieures à 6. Prend un nombre complexe en entrée.
Explication
Le code utilise des nombres complexes car il était plus court dans une étape intermédiaire et il semble également beaucoup plus rapide; vous pouvez également utiliser des paires en supprimant
Æi
et en remplaçant0
par0,0
sur la deuxième ligne.la source