El problema del peón perdido
Después de que terminó el juego de ajedrez, un peón sobreviviente quedó detrás de las líneas enemigas. ayudémoslo a encontrar el camino más corto de regreso a casa.
El problema original describe un tablero de "ajedrez" nXn y una función f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+
de pesos. el objetivo es encontrar el mejor camino desde un cuadrado en la línea inferior hasta otro cuadrado en la línea superior, donde los posibles movimientos son: izquierda, arriba, derecha, y no puedes salir del tablero.
El problema es relativamente fácil de resolver en O (n ^ 2) usando programación dinámica, pero esto es codegolf, y no nos importan las cosas inútiles como la complejidad del tiempo de ejecución ...
El problema
input: una matriz tridimensional (o alguna otra colección de su elección, recibida a través de stdin, o como argumento de función), correspondiente a un tablero de ajedrez regular, exactamente en tamaño: 7X8X3 (#linePasses X #rowSize X #movesPerPass) que contiene enteros no negativos. Los movimientos cuestan desde alguna posición (i,j)
donde i
está el índice de la fila, y j
es el índice de la columna, son:
a[i][j][0]
por el costo para viajar hasta-izquierda a la plaza(i+1,j-1)
, o gráficamente:\
.a[i][j][1]
por el costo de viajar hasta la cuadratura(i+1,j)
, o gráficamente:|
.a[i][j][2]
por el costo de viajar arriba-derecha a la plaza(i+1,j+1)
, o gráficamente:/
.
puede suponer que no contendrá una ruta que sea mayor que MAX_INT
.
salida: una salida ASCII 8X8 que muestra la mejor ruta (la más corta, es decir, la suma mínima de pesos) (si hay más de 1 resultado óptimo, puede mostrar una ruta arbitraria de su elección). el camino se dibuja de abajo hacia arriba, donde en cada línea, el personaje correspondiente a la posición del peón en el camino, es el que está a punto de hacer. por ejemplo, si el peón está a punto de moverse hacia la izquierda desde la columna 3 (a la columna 2), debe dibujar:
#?######
##\#####
donde ?
debe ser reemplazado con el siguiente movimiento. la posición final necesita ser dibujada como X
.
Ejemplos
entrada:
[
[[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]]
]
salida:
##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####
entrada:
[
[[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]]
]
salida:
######X#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
Este es el código de golf , por lo que gana el código más corto.
juega limpio. sin lagunas ...
EDITAR:
Iv'e escribió una solución directa sin golf en scala que puedes ver. También hay un sitio que puede jugar con el código scala en línea: scalakata (solo copie y pegue la esencia en scalakata, y presione el botón de reproducción)