Ispirato da We hopping tower e relativo a 2D Maze Minus 1D
introduzione
Il tuo compito è trovare il percorso più breve per uscire da un labirinto di array seguendo le regole specificate.
Sfida
Un array 1D a con n elementi può essere considerato come un labirinto composto da n punti, in cui il punto con indice k è collegato ai punti con k + a [ k ] e k - a [ k ] in un modo unidirezionale. In altre parole, puoi saltare avanti o indietro esattamente a [ k ] passi dal punto con indice k . I punti con un indice al di fuori dei limiti dell'array sono considerati al di fuori del labirinto.
Per illustrare questo, considera il seguente array,
[0,8,5,9,4,1,1,1,2,1,2]
Se siamo al 5 ° elemento in questo momento, poiché l'elemento è 4, possiamo saltare 4 passi in avanti al 9 ° elemento o 4 passi indietro al 1 ° elemento. Se facciamo quest'ultima, finiamo con l'elemento 0, che indica che non sono possibili ulteriori mosse. Se facciamo il primo, dato che il 9 ° elemento è 2, possiamo scegliere di saltare all'11 ° elemento, che è di nuovo un 2, e quindi possiamo saltare di nuovo al "13 ° elemento", che è fuori dai limiti del matrice e considerata un'uscita nel labirinto.
Quindi, se partiamo dall'elemento nel mezzo, un modo per uscire dal labirinto è saltare 1 passo indietro, 4 passi avanti, 2 passi avanti e ancora 2 passi avanti, che possono essere espressi come array [-1,4,2,2]
. In alternativa si può esprimere con la matrice [4,8,10,12]
che registra l'indice a base zero di tutti i punti intermedi e finali (1-based indice è anche bene), o solo i segni, [-1,1,1,1]
.
Anche scappare dal labirinto dall'estremità a basso indice è OK.
Usare la prima notazione e partire dallo stesso elemento, [1,1,1,2,2]
è anche una soluzione ma non è ottimale poiché ci sono 5 passaggi anziché 4.
Il compito è scoprire il percorso più breve per uscire dal labirinto dell'array e produrre il percorso. Se esistono più percorsi ottimali, è possibile emetterne uno o tutti. Se non ci sono soluzioni, dovresti emettere un valore falso scelto da te che è distinguibile da un percorso valido (anche la produzione di nessun output è OK).
Per semplicità, il numero di elementi nell'array è sempre un numero dispari e partiamo sempre dall'elemento nel mezzo.
Casi test
I casi di test illustrano varie forme di output, ma non si è limitati a questi.
Input
Output
[0,8,5,9,4,1,1,1,2,1,2]
[-1,4,2,2]
[2,3,7,1,2,0,2,8,9]
[2,9] (or [2,-5] or [[2,9],[2,-5]])
[0,1,2,2,3,4,4,4,3,2,2,3,0]
[1,-1,1,1]
[0,1,2,2,4,4,6,6,6,6,6,4,2,1,2,2,0]
[]
Specifiche
È possibile scrivere una funzione o un programma completo.
L'array contiene solo numeri interi non negativi.
Puoi prendere input e output attraverso qualsiasi modulo standard , ma specifica nella tua risposta quale modulo stai utilizzando.
Questo è code-golf , vince il numero più basso di byte.
Come al solito, qui si applicano scappatoie predefinite .
[1,1,1,-1]
invece di [-1,1,1,1]
?
[0,8,5,9,4,1,1,1,2,1,2]
, in uscita[[-1,4,2,2]]
)