Jouez à un programme ou à une fonction qui donne l' emplacement du gnou qui commence à la case sur un échiquier infini numéroté dans une spirale carrée dans le sens inverse des aiguilles d'une montre, où le gnou visite toujours la case la moins numérotée elle peut arriver qu'elle n'a pas encore visité. 1
Inspiration: Le chevalier pris au piège et OEIS A316667 .
Edit: Cette séquence est maintenant sur l'OEIS en tant que A323763 .
Le code peut produire l' emplacement , les premiers emplacements, ou générer la séquence sans aucune entrée.
N'hésitez pas à lui donner sa position après (ou jusqu'à) sauts, mais si c'est le cas, veuillez l'indiquer clairement dans votre réponse et assurez-vous qu'une entrée de donne (ou le cas échéant).1
[1]
Il s'agit de code-golf , donc l'objectif est de produire du code de travail dans le moins d'octets possible dans la langue de votre choix.
Remarque: le gnou devient piégé (un peu comme le chevalier le fait à son emplacement en , carré , et le chameau le fait à son , carré ) chez elle emplacement sur le carré . Le comportement de votre code peut être indéfini pour plus grand que cela. (Merci à Deadcode pour le code C ++ qui l'a trouvé!)
Détail
Le tableau ressemble à ce qui suit et continue indéfiniment:
101 100 99 98 97 96 95 94 93 92 91
102 65 64 63 62 61 60 59 58 57 90
103 66 37 36 35 34 33 32 31 56 89
104 67 38 17 16 15 14 13 30 55 88
105 68 39 18 5 4 3 12 29 54 87
106 69 40 19 6 1 2 11 28 53 86
107 70 41 20 7 8 9 10 27 52 85
108 71 42 21 22 23 24 25 26 51 84
109 72 43 44 45 46 47 48 49 50 83
110 73 74 75 76 77 78 79 80 81 82
111 112 113 114 115 116 117 118 119 120 121
Un gnou est une pièce d'échecs féerique "gnu" - une pièce d'échecs non standard qui peut se déplacer à la fois en tant que chevalier (un -leaper) et en tant que chameau (un -leaper).
En tant que telle, elle pourrait se déplacer vers l'un de ces emplacements à partir de son emplacement de départ :( 1 , 3 ) 1
. . . . . . . . . . .
. . . . 35 . 33 . . . .
. . . . 16 . 14 . . . .
. . 39 18 . . . 12 29 . .
. . . . . (1) . . . . .
. . 41 20 . . . 10 27 . .
. . . . 22 . 24 . . . .
. . . . 45 . 47 . . . .
. . . . . . . . . . .
Le plus bas d'entre eux est et elle n'a pas encore visité ce carré, donc est le deuxième terme de la séquence.
Elle pouvait ensuite passer de à n'importe lequel de ces endroits:
. . . . . . . . . . .
. . . . . . 14 . 30 . .
. . . . . . 3 . 29 . .
. . . . 6 1 . . . 53 86
. . . . . . . (10) . . .
. . . . 22 23 . . . 51 84
. . . . . . 47 . 49 . .
. . . . . . 78 . 80 . .
. . . . . . . . . . .
Cependant, elle a déjà visité la case , son troisième emplacement est donc la case , la plus basse qu'elle n'a pas encore visitée.
Les premiers termes du chemin du gnou sont:
1, 10, 3, 6, 9, 4, 7, 2, 5, 8, 11, 14, 18, 15, 12, 16, 19, 22, 41, 17, 33, 30, 34, 13, 27, 23, 20, 24, 44, 40, 21, 39, 36, 60, 31, 53, 26, 46, 25, 28, 32, 29, 51, 47, 75, 42, 45, 71, 74, 70, 38, 35, 59, 56, 86, 50, 78, 49, 52, 80, 83, 79, 115, 73, 107, 67, 64, 68, 37, 61, 93, 55, 58, 54, 84, 48, 76, 43, 69, 103, 63, 66, 62, 94, 57, 87, 125, 82, 118, 77, 113, 72, 106, 148, 65, 97, 137, 91, 129, 85
Les premiers sauts sont des mouvements de chevalier, donc les premiers termes coïncident avec A316667 .
Réponses:
JavaScript (Node.js) ,
191 ... 166164 octetsEnregistré 2 octets grâce à @grimy .
Renvoie le ème terme.N
Essayez-le en ligne! ou Voir une version formatée
Comment?
Indices en spirale
Afin de convertir les coordonnées en l'indice de spirale , nous calculons d'abord la couche avec:(x,y) I L
Qui donne:
Nous calculons ensuite la position dans la couche avec:P
Qui donne:
L'indice final est donné par:I
NB: La formule ci-dessus donne une spirale indexée 0.
Dans le code JS, nous calculons en fait immédiatement avec:4L2
Et puis soustrayez avec:P
Les mouvements des gnous
Compte tenu de la position actuelle , les 16 carrés cibles possibles du gnou sont testés dans l'ordre suivant:(x,y)
Nous les parcourons en appliquant 16 paires de valeurs signées . Chaque paire est codée comme un seul caractère ASCII.(dx,dy)
Nous gardons une trace de la valeur minimale rencontrée en et des coordonnées de la cellule correspondante en .m (H,V)
Une fois le meilleur candidat trouvé, nous le marquons comme visité en positionnant un drapeau dans l'objet , qui est également notre fonction récursive principale.g
À la première itération, nous commençons par et . Cela garantit que la première cellule sélectionnée est et que c'est la première cellule à être marquée comme visitée.x=1 y=2 (0,0)
la source
Buffer
pour forcer chaque caractère à être interprété comme un seul octet?Buffer
constructeur accepte toujours une chaîne. Donc, oui, c'est un moyen plutôt bon marché de le convertir en une liste d'octets - par opposition à[..."string"].map(c=>do_something_with(c.charCodeAt()))
.Noix de coco ,
337276 octetsRenvoie un générateur de valeurs. Pourrait probablement être joué au golf plus. ( En particulier , la séquence de tuples de différence.) De l' algorithme de prise en spirale cette réponse math.se .
Essayez-le en ligne!
la source
for a,b in (
->for a,b in(
(peut-être que vous pouvez aussi jouer au golf le tuple delta de tuples)q
et un zip est plus court pour les tuples: 306 octets peuvent toujours être jouables au golf bien sûr0.5
->.5
pour un autre octet de sauvegarde;A**2
->A*A
pour un de plus.05AB1E ,
7765585752 octets-6 octets grâce à @Arnauld en utilisant un portage de sa formule.
Génère les valeurs sous forme de liste (de décimales).n+1
Essayez-le en ligne (le
ï
dans le pied de page supprime le.0
pour rendre la sortie plus compacte, mais n'hésitez pas à le supprimer pour voir le résultat réel).Explication du code:
Explication générale:
Nous détenons tous les résultats (et donc les valeurs que nous avons déjà rencontrées) dans lex,y
global_array
, qui est initialement démarré en tant que[1]
.Nous détenons la coordonnée actuelle en variable , qui est initialement .
X
[0,0]
La liste des coordonnées que nous pouvons atteindre en fonction des coordonnées actuelles est:x,y
La liste que je mentionne dans l'explication du code ci-dessus contient ces valeurs auxquelles nous pouvons accéder, après quoi le actuel (stocké dans une variable ) est ajouté.x,y
X
Ensuite, il calculera les valeurs en spirale sur la base de ces coordonnées . Pour ce faire, il utilise la formule suivante pour une coordonnée donnée :x,y x,y
C'est la même formule que @Arnauld utilise dans sa réponse , mais écrite différemment pour utiliser les fonctions internes de 05AB1E pour double, carré, -1, +1, etc.
(Si vous voulez voir uniquement cette partie en spirale du code en action: essayez-la en ligne .)
Après avoir obtenu toutes les valeurs que nous pouvons atteindre pour la coordonnée donnée , nous supprimons toutes les valeurs qui sont déjà présentes dans le , puis nous obtenons le minimum des valeurs (restantes). Ce minimum est ensuite ajouté à la variable, et est remplacé par la coordonnée de ce minimum.x,y x , y
x,y
global_array
global_array
X
Après avoir bouclé le
input
nombre de fois, le programme affichera celaglobal_array
en résultat.la source