Gravity Guy es un juego en el que la única entrada del usuario es una sola tecla que invierte la dirección de la gravedad. Dado un nivel de arte ASCII, determine si es posible que Gravity Guy llegue al final.
Reglas
- La dirección inicial de la gravedad es hacia abajo .
- La primera columna de la entrada siempre contendrá solo una
#
, sobre la cual Gravity Guy comienza . - Cada iteración, se mueve al personaje directamente a su derecha .
- Si su camino está bloqueado y se mueve hacia a
#
, el jugador pierde . - Después de moverse, el jugador puede cambiar opcionalmente la gravedad de abajo hacia arriba o de arriba hacia abajo.
- Gravity Guy luego pasa a la siguiente
#
(en la dirección de gravedad actual). - Si no hay
#
que caer y él se cae de la red , el jugador pierde . - Si Gravity Guy se mueve del lado derecho de la cuadrícula de entrada, el jugador gana .
Ejemplo
Si esta fue la cuadrícula de entrada:
###
# # #
###
Gravity Guy comenzaría en el x
y el estar en estas posiciones después de cada iteración. ^
= cambiar la gravedad a arriba y v
= cambiar la gravedad a abajo.
v ^ v
-------------------------------------------------------------
### | ### | ### | ### | ### | ###
x | | x | x | x |
# # | #x # | # # | # # | # # | # # x
### # | ### # | ### # | ### # | ### # | ### #
Como puede ver, al cambiar la gravedad en estos momentos, Gravity Guy llega al final, por lo que esta entrada devolvería un valor verdadero.
Presupuesto
- La cuadrícula de entrada puede estar en cualquier formato de "cuadrícula" apropiado (cadena multilínea rellenada con espacios, matriz de cadenas de línea, matriz de matriz de caracteres, etc.).
- Si es posible que el jugador gane el nivel, genera un
truthy
valor. Si no, emite unfalsey
valor. - El ancho y la altura de la cuadrícula serán
50
caracteres como máximo. - Este es el código de golf , ¡que gane el código más corto en bytes!
Casos de prueba
(cada caso separado por ----------
, cualquier línea en blanco también debe rellenarse con espacios)
Cierto
######### ######## ###### ######
# # # # # # #
### # # # # # # # # #
# ## # # ## # # # # # ##
# # # # # # # # # #######
# # # # # ### # #
# ## # ## # # # #
# # # # # #
# #################################### #
# #
#############################################
----------
###
----------
#####
####
----------
#####
# # #
# # #
#####
----------
############
###### ######
############
----------
### ###
# #
#### # ####
# #
# #
#
----------
######
#
##
#######
### #
# #
#####
----------
#####
# #
## #
#######
###
#
######
----------
###
# # #
###
----------
### ###
### ##
# #
#####
----------
#
# #
#
# # #
#
#
#
#
----------
##### ####
# # #
# # # ## #
# #
##### #### #
#
#########
----------
###########################
# # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
Falso
###
#
####
----------
### ###
----------
#
### ###
#### ###
#
----------
### ###
# # #
#### # # ####
# #
# #
# #
#
----------
#######
# #
## #####
### ######
# #
#######
----------
###########################
# # # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
code-golf
ascii-art
decision-problem
usuario81655
fuente
fuente
column
tipo especial , estaría bien usar, supongo.#
en la primera columna esté en la primera fila?Respuestas:
Caracoles , 15 bytes
Pruébalo en línea?
0.
^
es una opción que requiere que el patrón comience en la esquina superior izquierda.\
: espacio de partidon
: Gire 90 grados en cualquier dirección\ ,
: coincide con el espacio cero o más veces=\#
compruebe que hay un#
frente de nosotrosr
: establecer la dirección a la derecha}+
: hacer todo lo anterior una o más veces~
coincidir con una celda que está fuera de los límites de la cuadrículafuente
Perl,
93898177767574 bytesIncluye +2 para
-0p
Ejecute con el patrón de entrada (con todas las líneas espaciadas en la misma longitud) en STDIN:
gravity.pl
:Esta versión basada en archivo necesita la nueva línea final, por lo que en realidad son 75 bytes. Pero la versión basada en la línea de comandos no necesita esa nueva línea adicional, por lo que cuenta como 74 bytes:
Explicación:
Esto construirá una cadena con una
w
en cada posición que el tipo de gravedad puede alcanzar. Entonces, para el penúltimo ejemplo de verdad construirá:Entonces, el tipo de gravedad puede hacerlo si y solo si hay un
w
en la última columna. La cadena se construirá reemplazando un espacio accesible porw
en cada ronda.Cada reemplazo será de la forma
lo que exigirá que el espacio esté precedido por un prefijo y seguido de postfix, pero reemplace solo el espacio
w
sin necesidad de mucha agrupación avanzada.Suponga que
$n
contiene una expresión regular que progresará lo suficiente como para que los lados izquierdo y derecho estén exactamente uno debajo del otro. Entonces las expresiones regulares relevantes son:Con eso fuera del camino, el programa es fácil:
fuente
JavaScript (ES6), 174 bytes
Toma una matriz horizontal de cadenas y devuelve el número de puntos de salida. La transposición de la matriz me cuesta 29 bytes. Sin golf:
fuente
Pip ,
85686259 + 1 = 60 bytesUtiliza la
-r
bandera para leer todas las líneas de stdin.Pruébalo en línea!
Breve explicacion
La estrategia es esencialmente una búsqueda de amplitud. Transponemos la entrada y el bucle sobre las líneas (columnas), manteniendo una lista de las posiciones y que el jugador podría alcanzar en esa columna. La salida después de la última columna es una lista no vacía si el jugador puede ganar, o una lista vacía (que se imprime como una nueva línea final) si el jugador pierde.
Explicación completa
Una función de las variables utilizadas en este programa:
i == 0
,l == []
,s == " "
.La
-r
bandera pone una lista de las líneas de entradag
.FcZg{...}
cremallerasg
y bucles sobre cada columnac
. (UnaryZ
, cuando se aplica a una lista de iterables, actúa como Pythonzip(*g)
, transponiendo perfectamente una matriz 2D). Tenga en cuenta quec
será una lista, no una cadena.Dentro del bucle de la columna, restablecemos
y
la lista vacíaY
ankingl
.Fxi
bucles mási
. En iteraciones posteriores,i
habrá una lista de las coordenadas y que el jugador pudo alcanzar en la columna anterior. La primera vez, queremos comenzar con solo0
(esquina superior izquierda). La variable se preinicializa en un escalar0
, no en una lista[0]
, pero Pip lo repite de cualquier manera.Para cada una de las posiciones válidas en la última columna,
Ic@xQs
verifica si hay un espacio en esa posición en la columna actual. Si no, el jugador simplemente se topó con una pared y seguimos probando la siguiente posibilidad. Si es así, entonces queremos encontrar las posiciones a las que caerá el jugador en esta columna para cada dirección de gravedad, y agregarlas a la listay
usando el operadorP
ushB
ack.Gravedad hacia arriba (izquierda, en la versión transpuesta):
Gravedad bajando (derecha, en la versión transpuesta):
Si el jugador se cae de la cuadrícula en una dirección particular, la
@?
operación respectiva no encontrará un#
y dará cero. Este no es un índice válido y generará algunas advertencias en la próxima iteración, que, sin embargo, no son visibles sin la-w
bandera. Para nuestros propósitos, estos casos se eliminan esencialmente de la consideración.Después del ciclo interno,
i:UQy
toma la listay
de posiciones que hemos construido, elimina duplicados y se la asignai
. (Es necesario eliminar los duplicados porque, de lo contrario, la lista se hincha exponencialmente). Luego pasamos a la siguiente columna. Cuando hayamos recorrido todas las columnas, si hubiera una ruta válida,i
habrá una lista de posiciones no vacía (verdad); si no, será una lista vacía (falsey).fuente