Introducción
Todos saben que la posibilidad de navegar con éxito un campo de asteroides es de aproximadamente 3,720 a 1. Pero a pesar de su advertencia, Han Solo todavía está dispuesto a probar suerte.
Temiendo por su vida artificial, decide codificar, en el peculiar dialecto de la nave ( lea: su lenguaje preferido de Code Golf ), un programa de evitación de asteroides que decidirá qué camino tomar en un laberinto ASCII de campo de asteroides.
Entrada
El Millenium Falcon tiene un programa de mapeo de campo de asteroides, que proporciona datos similares a este:
| ##### ######### |
| ###### # ### # |
| # # # # #### # |
@ ## ####
|# # # ### ## |
|## ## #### # # |
|#### ##### # ## |
Las filas superiores quedan a la izquierda del Halcón, las filas inferiores están a la derecha del Halcón y las columnas representan lo que está frente al barco.
- Cada uno
#
es un obstáculo. - Cada espacio es un espacio vacío en el que la nave puede volar.
- La entrada siempre tiene 7 caracteres de altura. Este es el límite de ancho de mapeo de asteroides.
- La entrada siempre tiene 32 caracteres (30 para el campo en sí y 2 para los límites inicial y final). Este es el límite de profundidad de mapeo de asteroides. Las barras verticales
|
marcan el comienzo y el final de la asignación. @
Es el halcón. Siempre está en la fila central (cuarta fila) y la primera columna en la entrada.- El espacio que queda en las barras verticales en la última columna es el lugar al que debe llegar el barco. Siempre está en la fila central (cuarta fila) y la última columna en la entrada.
La entrada se puede tomar como una cadena de varias líneas, una matriz de cadenas, desde STDIN o parámetros de una función, o leer desde un archivo.
Posibles maniobras
Usted es perseguido por TIE-Fighters, por lo tanto, siempre debe avanzar. Por lo tanto, hay tres formas en que el barco puede volar en cada paso:
-
Adelante/
Adelante y gire a la izquierda\
Adelante y gire a la derecha
Por ejemplo, estas son rutas válidas:
@---
--
/ \ /
@ -
-
/ \
/ \
@ \
Como puede ver, siempre hay exactamente un movimiento por columna. El Halcón es un pedazo de basura, por lo tanto, no puede hacer giros violentos. Lo que significa movimientos como /\
o no\/
están permitidos . Debe haber al menos un puro hacia adelante -
entre dos turnos opuestos. Por otro lado, es posible girar en una dirección para varios pasos seguidos, como se ve arriba.
El Halcón se estrella si un movimiento lleva a la nave a un lugar donde hay un obstáculo. Por ejemplo, estos movimientos conducen a bloqueos:
@-#
@
\
#
#
/
@
Tenga en cuenta que esto no es un bloqueo:
@-#
\
-
Salida
Debe generar el mismo campo de asteroide ASCII, con una ruta válida hasta el final. El Falcon debe imprimirse en el punto final en lugar del punto inicial.
Por ejemplo, una salida válida para el ejemplo de entrada dado anteriormente sería:
| ##### ######### |
| ###### #-------- ### # |
| # # #/ # ####\ # |
--------- ## \ #### ----@
|# # # ### \ ## / |
|## ## #### \ #/ # |
|#### ##### #-- ## |
Tu camino solo necesita no estrellar al halcón. No necesita ser el camino más corto posible.
Puede suponer que siempre habrá al menos un camino posible hacia el final.
Puede enviar a STDOUT, en un archivo o cualquier equivalente, siempre que el campo de asteroides se imprima exactamente como en esta publicación (por ejemplo, enviar una lista de coordenadas para la ruta no es válido).
Casos de prueba
Un campo de asteroides normal.
| ##### ######### | | ###### # ### # | | # # # # #### # | @ ## #### |# # # ### ## | |## ## #### # # | |#### ##### # ## |
Salida posible
| ##### ######### | | ###### #-------- ### # | | # # #/ # ####\ # | --------- ## \ #### ----@ |# # # ### \ ## / | |## ## #### \ #/ # | |#### ##### #-- ## |
Campo de asteroides hiperregulares
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | @ # # # # # # # # # # # # # # |# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # |
Salida posible
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | -# #-# #-# #-# #-# #-# #-# #--@ |#\#/#\#/#\#/#\#/#\#/#\#/#\#/# | | #-# #-# #-# #-# #-# #-# #-# #| |# # # # # # # # # # # # # # # |
Núcleo de la estrella de la muerte
| # # # # | | # # # | | # # # # # | @ # # # # # | # # # # | | # # # # # | | # # # # |
Salida posible
| # # # -- # | | --- # # / #\ - | | / #\ # # / # \ /#\ | - # \ # #/ # - # ----@ | # \ # ---- # # | | # \#/ # # # | | # - # # # |
Trinchera estrella de la muerte
|##############################| |##############################| |##############################| @ |##############################| |##############################| |##############################|
Salida
|##############################| |##############################| |##############################| ------------------------------@ |##############################| |##############################| |##############################|
Cueva de asteroides
|### ##########################| |## # ############### ## ######| |# ### ######## ### ## # #####| @ ###### ###### ### ## ### |######## ### ### ## #########| |########## # ### ## ##########| |########### #####|
Salida posible
|###-##########################| |##/#\############### ##-######| |#/###--######## ### ##/#\#####| -######\###### ### ##/###-----@ |########--### ### ##/#########| |##########\# ### ##/##########| |###########-------- #####|
Tanteo
R2D2 está ocupado nadando en pantanos, por lo que tendrá que programar el controlador del Falcon usted mismo, lo cual es tedioso. Por lo tanto, el código más corto gana .
-
en el camino en cada turno, que se define como un movimiento "hacia adelante". Pero los movimientos reales son siempre dos diagonales a la izquierda seguidos de dos diagonales a la derecha.Respuestas:
JavaScript (ES6), 186
201Fragmento ejecutable:
Esta función acepta una sola cadena con nuevas líneas. La función divide la cadena en una matriz utilizando el
...
operador y obtiene el índice de(x,y)
coordenadas por(33 * y) + x
.La función se ejecuta de forma recursiva, probando diferentes movimientos posibles para cada espacio. Cuando encuentra un obstáculo, devuelve un valor falso, y cuando alcanza el espacio objetivo final, regresa
true
. (En el código de golf, estotrue
es creado por!console.log(...)
).Tenga en cuenta que este código no utiliza tiradas largas de movimientos de giro a la derecha, sino que las puntúa con movimientos rectos. Es decir, hace la segunda opción a continuación, no la primera:
Esto parece ser legal, ya
-
que legalmente puede venir antes o después de un turno, entonces ¿por qué no ambos a la vez? Eso parece especialmente extraño al final, cuando el movimiento final es\
pero se muestra como@
:Mi truco de golf desagradable favorito aquí es el abuso de argumento predeterminado con
c=k=" "
. Los argumentos(i,l,c=" ")
dirían "use la cadena" "
parac
sif
no se proporciona un tercer argumento". Sin embargo, al hacerloc=k=" "
, decimos "sic
no se suministra, almacene" "
en la variable globalk
y luego almacene ese valorc
también". Dado que la recursividad comienza con un solo argumento,k
siempre se inicializa en la primera llamada a la función.Ligeramente no golfista:
fuente
" "
en una variable) que redujo mi puntaje aún más bajo.C (programa completo),
249247235 bytesEste es un programa completo que lee la entrada de un archivo y genera el resultado en stdout. El nombre del archivo se pasa como parámetro al programa.
Sin golf:
Salida:
fuente
-
seguido por un\
, pero\
está cubierto por el@
. (Mi programa hace lo mismo.)Lisp común, 303 bytes
Me divertí mucho con este desafío, es la primera tarea de codegolf que hice. Básicamente, hay una función recursiva simple que intenta cada movimiento viable hasta llegar a la posición final.
Golfizado / Minificado
Lee la entrada de un archivo i en el directorio de trabajo. Estoy bastante seguro de que todavía hay margen de mejora.
Código simple
Salida de muestra
fuente
ActionScript 3, 364 bytes
Divido esto en dos funciones; uno para cambiar la matriz en una matriz de matrices, y uno recursivo para calcular la ruta de vuelo.
Versión sin golf en un programa con un campo de asteroides de muestra definido:
fuente