W dalekim królestwie królowa szachów codziennie spaceruje po spiralnej ścieżce, ponumerowanej od 1 do n
, nie dbając o samą spiralę, ale po prostu wykonując ruchy królowej, tak jak na szachownicy. Królowa jest ukochana przez swoich poddanych i odnotowują każdy kwadrat, który odwiedza na swojej drodze. Biorąc pod uwagę, że królowa może rozpocząć swój spacer na dowolnym kwadracie, a kończy go na dowolnym kwadracie, jaki jest najkrótszy spacer królowej?
Wyzwanie
Biorąc pod uwagę spiralę liczb całkowitych na prostokątnej siatce, napisz funkcję, która zwraca jedną z najkrótszych możliwych ścieżek (liczoną przez liczbę przejechanych komórek) między dwiema liczbami na tej spiralnej siatce, używając ruchów szachowej królowej.
Na przykład od 16
do 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
Niektóre możliwe ścieżki obejmują 16, 4, 2, 10, 25
i 16, 5, 1, 9, 25
.
Zasady
- Dane wejściowe będą stanowić dowolne dwie dodatnie liczby całkowite.
- Dane wyjściowe będą ścieżką liczb całkowitych (w tym obu punktów końcowych) w poprzek spirali przy użyciu tylko ruchów ortogonalnych i ukośnych.
- Długość ścieżki jest liczona przez liczbę przejechanych komórek.
- Twoja odpowiedź może być programem lub funkcją.
- To jest kod golfowy, więc wygrywa najmniejsza liczba bajtów.
Jak zawsze, jeśli problem jest niejasny, daj mi znać. Powodzenia i dobrej gry w golfa!
Przypadki testowe
>>> 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
źródło
Odpowiedzi:
APL (Dyalog Unicode) ,
5957 bajtów SBCSWypróbuj online!
-2 bajty dzięki @ngn.
Anonimowa funkcja, która akceptuje dwa punkty końcowe jako lewy i prawy argument.
Niegolfowane i jak to działa
Królowa najpierw porusza się po przekątnej, więc wystarczy wstępnie obliczyć współrzędne każdej liczby do
max(start,end)
.Algorytm generujący współrzędne jest inspirowany kilkoma odpowiedziami na powiązane wyzwanie , ale nieco różni się od żadnej z istniejących odpowiedzi:
r=1 2 3 4 5 6 7 8 9 10
n=1 1 2 2 3 3 4 4 5 5
r
wedługn
.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
Następnie, gdy wektor współrzędnych
v
jest gotowy, możemy łatwo przekonwertować między indeksem spiralnym a współrzędnymi za pomocąv[i]
iv⍳coord
(znalezienie pierwszego indeksucoord
inv
).źródło
(⍵⊃v)-⍺⊃v
->⊃⍵⍺-.⊃⊂
(⍺⌷v)
->v[⍺]
Mathematica
615530 bajtówTo konstruuje siatkę liczb, przekształca ją w wykres, a następnie znajduje najkrótszą ścieżkę między dwoma wprowadzonymi liczbami.
UnGolfed
numberSpiral
pochodzi z Mathworld Prime Spiral . Tworzy spiralę Ulam n od n (bez podświetlania liczb pierwszych).findPath
konwertuje siatkę liczb na wykres. Krawędzie są prawidłowymi ruchami królowej na siatce liczb.Przykłady
{4,5}
{13,3,1,7,22}
{16,4,1,9,25}
Najkrótsza ścieżka od 80 do 1 zawiera 5, a nie 6 wierzchołków.
{80, 48, 24, 8, 1}
Grał w golfa
źródło
Scala (830 bajtów)
Tworzy spiralę w kwadratowej macierzy 2D za pomocą czterech wzajemnie rekurencyjnych funkcji. Kolejne wyszukiwanie rekurencyjne w celu zbudowania listy ścieżek.
Nie golfił
źródło
Rubinowy,
262218216 bajtówTo jest port mojej odpowiedzi w Pythonie . Sugestie dotyczące gry w golfa mile widziane.
Edit: 45 bajty dzięki Jordana i ich sugestie
d=[0]*n=m*m;*e=c=0;*t=a
,.rect
,0<=>x
ix,y=(e[a]-g=e[b]).rect; t<<d[(g.real+x)*m+g.imag+y]
. Kolejny bajt od(x+y*1i)
do(x+y.i)
.Nie golfowany:
źródło
q=
z odpowiedzi, ponieważ nie liczysz jej bajtów.c=0;e=[c];t=[a]
można skrócić do*e=c=0;*t=a
. Można wymienićz=e[a]-e[b];x,y=z.real,z.imag
zx,y=(e[a]-e[b]).rect
ix+=x<0?1:x>0?-1:0
zx+=0<=>x
(samo dlay
). Myślę, że to sprowadza się do 229 bajtów.d
zd=[0]*m*m
, a następnie zastąpićd[c.real][c.imag]
zd[c.real*m+c.imag]
id[e[b].real+x][e[b].imag+y]
zd[(e[b].real+x)*m+e[b].imag+y]
.t<<d[(e[b].real+x)*m+e[b].imag+y]
można ją skróciću,v=e[b].rect;t<<d[(u+x)*m+v+y]
.d=[0]*m*m
nad=[0]*n=m*m
i(m*m).times
nan.times
. To 219.x,y=(e[a]-e[b]).rect
nax,y=(e[a]-g=e[b]).rect
, usuwającu,v=e[b].rect
i zmieniająct<<d[(u+x)*m+v+y]
nat<<d[(g.real+x)*g.imag+v+y]
(w zasadzie cofam mój komentarz od drugiego do ostatniego).Python 3, 316 bajtów
Ta odpowiedź analizuje współrzędne
a
ib
na spirali (używając liczb zespolonych) i dodaje najpierw ruchy ukośne, a następnie ruchy ortogonalne.Nie golfowany:
źródło