Disegnare il triangolo Sierpinski è stato fatto a morte . Ci sono altre cose interessanti che possiamo fare con esso però. Se strizziamo gli occhi abbastanza forte nel triangolo, possiamo vedere i triangoli capovolti come nodi di un grafico frattale. Troviamo il nostro modo di aggirare quel grafico!
Innanzitutto, assegniamo un numero a ciascun nodo. Il triangolo capovolto più grande sarà il nodo zero, e quindi scendiamo strato per strato (larghezza prima), assegnando numeri consecutivi nell'ordine in alto a sinistra-a destra:
Fare clic per una versione più grande in cui i numeri piccoli sono un po 'meno sfocati.
(Naturalmente, questo modello continua all'infinito all'interno dei triangoli blu). Un altro modo per definire la numerazione è che il nodo centrale ha indice 0
, ei figli di nodo i
(triangoli adiacenti del seguente scala ridotta) hanno indici 3i+1
, 3i+2
e 3i+3
.
Come ci muoviamo in questo grafico? Ci sono fino a sei passaggi naturali che uno può prendere da un dato triangolo:
- È sempre possibile spostarsi attraverso il punto medio di uno dei bordi fino a uno dei tre figli del nodo corrente. Indicheremo queste mosse come
N
,SW
eSE
. Ad esempio, se siamo attualmente sul nodo2
, questi porterebbe a nodi7
,8
,9
rispettivamente. Altri movimenti attraverso i bordi (verso discendenti indiretti) non sono consentiti. - Si può anche spostarsi attraverso uno dei tre angoli, purché non tocchi il bordo del triangolo, verso il genitore diretto o uno dei due antenati indiretti. Indicheremo queste mosse come
S
,NE
eNW
. Ad esempio, se siamo attualmente sul nodo31
,S
porterebbe a10
, nonNE
sarebbe valido eNW
porterebbe a0
.
La sfida
Dati due numeri interi non negativi x
e y
, trova il percorso più breve da x
a y
, usando solo le sei mosse descritte sopra. Se esistono diversi percorsi più brevi, emettere uno di essi.
Nota che il tuo codice dovrebbe funzionare per più di solo i 5 livelli illustrati nel diagramma sopra. Si può presumere che x, y < 1743392200
. Ciò garantisce che si inseriscano in un numero intero con segno a 32 bit. Nota che questo corrisponde a 20 livelli dell'albero.
Il codice deve elaborare qualsiasi input valido in meno di 5 secondi . Mentre questo esclude una bruta forza all'ampiezza della ricerca, dovrebbe essere un vincolo abbastanza allentato: la mia implementazione di riferimento gestisce input arbitrari per profondità 1000 in mezzo secondo (che sono numeri di ~ 480 cifre per i nodi).
È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT (o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).
L'output dovrebbe essere piatta, elenco inequivocabile delle stringhe N
, S
, NE
, NW
, SE
, SW
, utilizzando qualsiasi separatore ragionevole (spazi, linefeeds, virgole, ","
...).
Si applicano le regole standard del code-golf .
Casi test
I primi pochi casi di test possono essere elaborati a mano utilizzando lo schema sopra. Gli altri assicurano che le risposte siano sufficientemente efficienti. Per quelli, potrebbero esserci altre soluzioni della stessa lunghezza che non sono elencate.
0 40 => N N N N
66 67 => S SW N N N
30 2 => NW NW -or- NE SW
93 2 => NE SW
120 61 => NW NW NW NW N SE SW N
1493682877 0 => S S NW NW
0 368460408 => SW SW N N SW SW SE SW SW N SE N N SW SW N SE SE
1371432130 1242824 => NW NW NE NW N SE SW SW SW SE SE SW N N N N SW
520174 1675046339 => NE NW NE NE SE SE SW SW N SE N SW N SW SE N N N N SE SE SW SW
312602548 940907702 => NE NW S SW N N SW SE SE SE SW SE N N SW SE SE SE SW
1238153746 1371016873 => NE NE NE SE N N SW N N SW N SE SE SW N SW N N SE N SE N
547211529 1386725128 => S S S NE NW N N SE N SW N SE SW SE SW N SE SE N SE SW SW N
1162261466 1743392199 => NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE