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+2e 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,SWeSE. Ad esempio, se siamo attualmente sul nodo2, questi porterebbe a nodi7,8,9rispettivamente. 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,NEeNW. Ad esempio, se siamo attualmente sul nodo31,Sporterebbe a10, nonNEsarebbe valido eNWporterebbe a0.
La sfida
Dati due numeri interi non negativi xe y, trova il percorso più breve da xa 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
