In einem fernen Königreich macht eine Schachkönigin täglich einen Spaziergang über einen von 1 bis 1 nummerierten n
Spiralpfad, ohne sich darum zu kümmern, der Spirale selbst zu folgen, sondern einfach die Bewegungen der Königin wie auf einem Schachbrett auszuführen. Die Königin wird von ihren Untertanen geliebt, und sie notieren sich jedes Feld, das sie auf ihrem Weg besucht. Was ist der kürzeste Spaziergang der Königin, den sie machen kann, wenn die Königin ihren Spaziergang auf einem beliebigen Feld beginnen und auf einem beliebigen Feld beenden kann?
Die Herausforderung
Schreiben Sie bei einer gegebenen Spirale von ganzen Zahlen in einem rechteckigen Gitter eine Funktion, die einen der kürzesten möglichen Pfade (gezählt nach der Anzahl der zurückgelegten Zellen) zwischen zwei Zahlen in diesem Spiralgitter mit den Zügen einer Schachkönigin zurückgibt .
Zum Beispiel von 16
bis 25
:
25 10 11 12 13
24 9 2 3 14
23 8 1 4 15
22 7 6 5 16
21 20 19 18 17
Einige mögliche Pfade umfassen 16, 4, 2, 10, 25
und 16, 5, 1, 9, 25
.
Regeln
- Die Eingabe besteht aus zwei beliebigen positiven ganzen Zahlen.
- Die Ausgabe ist ein Pfad von ganzen Zahlen (einschließlich beider Endpunkte) über die Spirale, wobei nur orthogonale und diagonale Bewegungen verwendet werden.
- Die Länge eines Pfades wird durch die Anzahl der zurückgelegten Zellen gezählt.
- Ihre Antwort kann ein Programm oder eine Funktion sein.
- Dies ist Code Golf, also gewinnt die kleinste Anzahl von Bytes.
Wie immer, wenn das Problem unklar ist, lassen Sie es mich bitte wissen. Viel Glück und gutes Golfen!
Testfälle
>>> queen_spiral(4, 5)
4, 5
>>> queen_spiral(13, 20)
13, 3, 1, 7, 20
>>> queen_spiral(14, 14)
14
>>> queen_spiral(10, 3)
10, 11, 3
>>> queen_spiral(16, 25)
16, 4, 2, 10, 25
>>> queen_spiral(80, 1)
80, 48, 24, 8, 1
quelle
Antworten:
APL (Dyalog Unicode) ,
5957 Byte SBCSProbieren Sie es online aus!
-2 Bytes dank @ngn.
Anonyme Funktion, die zwei Endpunkte als linkes und rechtes Argument akzeptiert.
Ungolfed & wie es funktioniert
Die Königin bewegt sich zuerst diagonal, so dass es ausreicht, die Koordinaten jeder Zahl bis zu vorab zu berechnen
max(start,end)
.Der Koordinatengenerierungsalgorithmus ist von mehreren Antworten auf die damit verbundene Herausforderung inspiriert , unterscheidet sich jedoch geringfügig von den vorhandenen Antworten:
r=1 2 3 4 5 6 7 8 9 10
n=1 1 2 2 3 3 4 4 5 5
r
byn
.1 2 3 3 4 4 5 5 5 6 6 6 7 7 7 7 8 8 8 8 9 9 9 9 9 10 10 10 10 10
Sobald der Koordinatenvektor
v
fertig ist, können wir mitv[i]
undv⍳coord
(Finden des ersten Index voncoord
inv
) leicht zwischen dem Spiralindex und den Koordinaten konvertieren .quelle
(⍵⊃v)-⍺⊃v
->⊃⍵⍺-.⊃⊂
(⍺⌷v)
->v[⍺]
Mathematica
615530 BytesDadurch wird ein Zahlenraster erstellt, in ein Diagramm konvertiert und dann ein kürzester Pfad zwischen den beiden eingegebenen Zahlen gefunden.
UnGolfed
numberSpiral
ist von Mathworld Prime Spiral . Es wird eine n mal n Ulam-Spirale erzeugt (ohne die Primzahlen hervorzuheben).findPath
konvertiert das Zahlenraster in ein Diagramm. Kanten sind gültige Königinbewegungen im Zahlenraster.Beispiele
{4,5}
{13,3,1,7,22}
{16,4,1,9,25}
Der kürzeste Weg von 80 nach 1 enthält 5, nicht 6 Eckpunkte.
{80, 48, 24, 8, 1}
Golf gespielt
quelle
Scala (830 Bytes)
Erstellt die Spirale in einem quadratischen 2D-Array mit vier gegenseitig rekursiven Funktionen. Eine weitere rekursive Suche zum Erstellen der Pfadliste.
Ungolfed
quelle
Ruby,
262218216 BytesDies ist eine Portierung meiner Python-Antwort . Golfvorschläge willkommen.
Edit: 45 Bytes dank Jordan und ihre Vorschläge
d=[0]*n=m*m;*e=c=0;*t=a
,.rect
,0<=>x
undx,y=(e[a]-g=e[b]).rect; t<<d[(g.real+x)*m+g.imag+y]
. Ein weiteres Byte von(x+y*1i)
bis(x+y.i)
.Ungolfed:
quelle
q=
aus Ihrer Antwort entfernen , da Sie die Bytes nicht zählen.c=0;e=[c];t=[a]
kann auf verkürzt werden*e=c=0;*t=a
. Sie könnenz=e[a]-e[b];x,y=z.real,z.imag
mitx,y=(e[a]-e[b]).rect
undx+=x<0?1:x>0?-1:0
mit ersetzenx+=0<=>x
(gleich füry
). Ich denke, das bringt es auf 229 Bytes.d
mitd=[0]*m*m
und ersetzen Sie sied[c.real][c.imag]
durchd[c.real*m+c.imag]
undd[e[b].real+x][e[b].imag+y]
mitd[(e[b].real+x)*m+e[b].imag+y]
.t<<d[(e[b].real+x)*m+e[b].imag+y]
kann auf verkürzt werdenu,v=e[b].rect;t<<d[(u+x)*m+v+y]
.d=[0]*m*m
vond=[0]*n=m*m
und(m*m).times
zun.times
. Das ist 219.x,y=(e[a]-e[b]).rect
zux,y=(e[a]-g=e[b]).rect
, Löschenu,v=e[b].rect
und Ändernt<<d[(u+x)*m+v+y]
zut<<d[(g.real+x)*g.imag+v+y]
(im Grunde zurückkehren meine zweite bis letzten Kommentar).Python 3, 316 Bytes
Diese Antwort betrachtet die Koordinaten von
a
undb
auf der Spirale (unter Verwendung komplexer Zahlen) und addiert zuerst die diagonalen Bewegungen und dann die orthogonalen Bewegungen.Ungolfed:
quelle