Il problema del pedone perduto
Dopo che la partita a scacchi terminò, una pedina sopravvissuta fu lasciata dietro le linee nemiche. aiutiamolo a trovare la via più breve per tornare a casa.
Il problema originale descrive una scacchiera "scacchi" nXn e una funzione f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+
di pesi. l'obiettivo è quello di trovare il percorso migliore da un quadrato nella linea di fondo, verso qualche altro quadrato nella linea superiore, dove le mosse possibili sono: sinistra-su, su, destra-su, e non puoi uscire dal tabellone.
Il problema è relativamente facile da risolvere in O (n ^ 2) usando la programmazione dinamica, ma questo è codegolf e non ci interessa cose inutili come la complessità del tempo di esecuzione ...
Il problema
input: un array tridimensionale (o qualche altra raccolta a scelta, ricevuta tramite stdin o come argomento di funzione), corrispondente a una normale scacchiera, esattamente nelle dimensioni: 7X8X3 (#linePasses X #rowSize X #movesPerPass) contenente numeri interi non negativi. i costi di spostamento da una posizione in (i,j)
cui si i
trova l'indice di riga e j
l'indice di colonna sono:
a[i][j][0]
per il costo di viaggiare fino a sinistra di piazza(i+1,j-1)
, o graficamente:\
.a[i][j][1]
per il costo di viaggiare fino a piazza(i+1,j)
, o graficamente:|
.a[i][j][2]
per il costo di viaggiare in alto a destra di piazza(i+1,j+1)
, o graficamente:/
.
si può presumere che non conterrà un percorso che è maggiore di MAX_INT
.
output: un output ASCII 8X8 che mostra il percorso migliore (il più breve, ovvero la somma minima dei pesi) (se esiste più di 1 risultato ottimale, è possibile mostrare un percorso arbitrario a scelta). il tracciato viene tracciato dal basso verso l'alto, dove in ogni riga, il carattere corrispondente alla posizione del pedone nel tracciato è quello che sta per creare. ad es. se il pedone sta per spostarsi verso l'alto-a sinistra dalla colonna 3 (alla colonna 2), dovresti disegnare:
#?######
##\#####
dove ?
dovrebbe essere sostituito con la prossima mossa. la posizione finale deve essere disegnata come X
.
Esempi
ingresso:
[
[[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]]
]
produzione:
##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####
ingresso:
[
[[41,27,38],[12,83,32],[50,53,35],[46,32,26],[55,89,82],[75,30,87],[2,11,64],[8,55,22]],
[[56,21,0],[83,25,38],[43,75,63],[56,60,77],[68,55,89],[99,48,67],[94,30,9],[62,62,58]],
[[23,18,40],[24,47,61],[96,45,72],[71,6,48],[75,63,98],[93,56,51],[23,31,30],[49,34,99]],
[[20,47,42],[62,79,72],[32,28,44],[68,61,55],[62,39,57],[4,17,49],[97,85,6],[91,18,12]],
[[51,50,11],[32,39,56],[12,82,23],[33,88,87],[60,55,22],[29,78,14],[70,11,42],[63,94,67]],
[[75,64,60],[27,79,86],[70,72,56],[55,45,32],[95,67,12],[87,93,98],[81,36,53],[38,22,93]],
[[31,80,50],[77,71,22],[59,46,86],[64,71,53],[41,19,95],[62,71,22],[92,80,41],[26,74,29]]
]
produzione:
######X#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
questo è code-golf , quindi vince il codice più corto.
giocare pulito. nessuna scappatoia ...
MODIFICARE:
Iv'e ha scritto una soluzione semplice senza golf in scala che puoi vedere. C'è anche un sito su cui puoi giocare con lo scala code online: scalakata (basta copiare e incollare l'essenza in scalakata e premere il pulsante play)