Cree un programa que determine, dada una entrada de la ruta, si Mario puede llegar al final, denotado por E
, desde el principio, denotado por S
.
Un camino se verá así:
S = E
=====
En una ruta, los diversos símbolos y lo que representan son:
=
: pared / piso / techo. Mario no puede caminar a través de la pared, y no puede caerse de un piso, ni saltar de un techo (se golpearía la cabeza)S
: aire, excepto mostrar dónde comienza Mario. Esto siempre aparecerá en la columna más a la izquierda de la entrada, a nivel del suelo.E
: aire, excepto mostrar dónde quiere llegar Mario. Esto siempre aparecerá en la columna más a la derecha de la entrada, a nivel del suelo.
La entrada tendrá espacios en cada lugar donde Mario pueda caminar.
Mario solo puede avanzar; en este ejemplo, Mario no puede llegar a la meta
S
===
===
E
====
ni puede él en este
E
==
==
#==
==
==
==
S ==
======
Sin embargo, puede alcanzar el espacio indicado por #
(que no aparecerá en la entrada), porque puede saltar hasta cuatro celdas de altura; Mario es sobrehumano. Como otro ejemplo de su sobrehumanidad:
S
=
=
=
=
=
= #
= =
=
=
=
= E
=======
Mario puede llegar al E
caer la gran distancia, sobrevivir y caminar con calma E
. Tenga en cuenta que no puede alcanzar el #
, porque Mario cae directamente hacia abajo.
Mario puede saltar muy alto, pero no muy lejos en comparación.
S E
== ==
= =
Mario puede intentar saltar la brecha, pero fallará y caerá directamente. No puede llegar al final.
Mario puede alcanzar la meta en todos estos ejemplos:
E
=
=
=
S=
==
=
= E
S= =
== =
= =
=====
S
=
= E
====
Este es el código de golf, ¡por lo que gana menos bytes!
fuente
#
, porque Mario cae directamente". Si estoy viendo esto correctamente, ¿no caería directamente sobre el#
? Además, ¿se definen los saltos como un máximo de 4 espacios hacia arriba y un máximo de 1 espacio, verdad?#
. En cuanto a la segunda pregunta: no soy OP pero supongo que tienes razón. (eso es lo que asumí en mi solución)E
no aparece en la columna de la derecha porque el nivel del suelo se extiende uno a la derecha desde el resto del mapa.Mario cannot walk through wall , and cannot fall past a floor, or jump past a ceiling
Respuestas:
Slip ,
382725 bytesRequiere que la entrada se rellene en un rectángulo de modo que haya espacios en cada celda que Mario necesita atravesar (potencialmente con una línea inicial llena de espacios). Imprime una cadena que representa la ruta válida (que incluye
S
,E
y todos los=
recorridos excepto el último) o nada si no existe una ruta.Pruébalo aquí.
Explicación
Slip fue la entrada de Sp3000 a nuestro desafío de diseño de lenguaje de coincidencia de patrones 2D. Es un poco como una extensión 2D de expresiones regulares donde puede dar instrucciones al cursor del motor cuando se permite o se requiere que gire a la izquierda o la derecha. También tiene una característica conveniente donde puede evitar que el cursor avance, permitiéndole hacer coincidir una sola posición dos veces seguidas (con diferentes patrones).
El deslizamiento no tiene algo comparable a la búsqueda de expresiones regulares, pero dado que puede moverse sobre cualquier posición varias veces, uno puede probar la condición y luego regresar. Usamos esto para asegurarnos de que solo saltamos cuando estamos en el suelo moviéndonos hacia la loseta del suelo después de cada paso.
fuente
Java
234 230 221 216 208 207 205179 BytesMira, vencí a C y Python? ¡He logrado la verdadera trascendencia entre los mortales! Bromas aparte, este fue un desafío divertido. La siguiente función toma la entrada como una matriz de cadenas de columnas, cada una con la misma longitud. Si esto va en contra de las reglas, hágamelo saber. Produce 1, lo que significa una ejecución exitosa de Mario y cualquier otro valor que implique una ejecución fallida de Mario.
Aquí está la lógica más antigua (que es similar a la versión actual) con ejemplos de uso y salida. Además de algunos comentarios que explican la lógica.
fuente
Python,
260239222215209206 Bytes,pruébalo en ideone (con casos de prueba)
llamar como:
f([' S=', ' E='])
notas del parche:
Ahora, como algunas de las otras soluciones, supone que la entrada es una serie de cadenas de colores, cada una de las cuales comienza con un ""
Contenedor para formulario de entrada antiguo:
g=lambda x:f(map("".join,zip(*([" "*x.index("\n")]+x.split("\n")))))
Además, arreglé un error por el cual Mario podía saltar bloques por encima de él.
versión sin golf con explicaciones:
f
recursivamente se llama a sí mismo en todas las direcciones desde las que Mario puede moversey,x
. RegresaTrue
cuando alcanza el"E"nd
, que luego vuelve a través de todas las llamadas de función hasta queg
finalmente regresaTrue
.fuente
else
antes de la finalreturn
?Caracoles ,
413729 bytesGracias a feersum por su ayuda para evitar rutas superpuestas y por guardar 4 bytes.
Requiere que la entrada se rellene en un rectángulo de manera que haya espacios en cada celda que Mario necesita atravesar (potencialmente con una línea inicial llena de espacios).
Pruébalo en línea!
Explicación
Snails fue la entrada de Feersum a nuestro desafío de diseño de lenguaje de coincidencia de patrones 2D. Al igual que Slip, también es similar a la expresión regular, pero la principal diferencia es que a) esta admite aserciones (lookarounds) yb) aparte de estas aserciones, no es posible atravesar dos veces ninguna celda de la cuadrícula. Eso hace que este problema sea un poco complicado, ya que hay casos en los que Mario necesita caer en un agujero y saltar de nuevo, por ejemplo:
Además de estas diferencias, la sintaxis de los dos idiomas también difiere bastante.
Para evitar el problema de que no podemos atravesar una celda dos veces, siempre alternamos un paso horizontal con un paso vertical. Sin embargo, esto significa que tenemos que manejar una caída antes de pasar por encima del borde. Por lo tanto, las caídas técnicamente atravesarán baldosas del suelo, pero nos aseguraremos de que solo ocurran al lado del espacio abierto.
fuente
C,
256236213197 bytes20 bytes guardados por "Esto siempre aparecerá en la columna más a la izquierda de la entrada"
23 bytes guardados gracias al sistema basado en columnas de @ RohanJhunjhunwala
Pruébalo con ideone, con casos de prueba ...
Uso:
Sin disculpas con la explicación:
fuente
PHP,
399338284265251 bytesespera entrada como argumento de línea de comando con saltos de línea de estilo Unix y espacios finales en cada línea, devuelve el código de salida
1
para el éxito,0
para el fracasodesglose para funcionar
pruebas (en función m)
fuente
Ruby,
153147 bytesLo siento, Java ... ¡tu lugar como el mejor idioma que no es de golf para el trabajo está siendo tomado!
La entrada es una lista de cadenas de columnas, antepuesta con un solo espacio al estilo de cómo las soluciones Slip y Snails requieren que sus entradas se rellenen con un rectángulo de espacio vacío.
Pruébalo en línea!
fuente
Grime, 46 bytes (no competidor)
He actualizado Grime varias veces después de publicar este desafío, por lo que esta respuesta no es elegible para ganar. Algunos de los cambios son tan nuevos que no he podido incluirlos en TIO, pero una vez que lo haga, puede probar el programa . En cualquier caso, mi repositorio contiene una versión que maneja este código correctamente.
El programa imprime
1
si Mario puede alcanzar la meta, y0
si no. La entrada tiene que contener espacios en todos los lugares que Mario necesita visitar. Para entradas generales, tengo la siguiente solución de 57 bytes :Explicación
La explicación de alto nivel es que el no terminal
A
, definido en la primera línea, coincide con un sub-rectángulo 1 × 1 de la entrada donde Mario puede alcanzar la meta.A
se define como el literalE
(Mario ya está en la meta) o como un patrón 1 × 1 que está en la columna izquierda de un rectángulo 2 × n que contiene un salto válido de Mario a otra coincidenciaA
en la columna derecha. La segunda línea cuenta el número de coincidenciasA
que también contienen el carácter inicialS
y lo imprime.Aquí hay un desglose del código:
La idea es que la
\ {,-4}
parte de la izquierda coincida con el espacio a través del cual Mario salta hacia arriba, y la\ /*
parte de la derecha coincide con el espacio en el que luego se cae. Requerimos que aterrice en un partido deA
(ya que queremos alcanzar la meta) que está encima de un=
. Las pilas verticales debajo de ambas columnas simplemente garantizarán que las columnas tengan la misma altura, por lo que podemos concatenarlas (que es lo que hace el espacio único en el medio). Aquí hay un diagrama de arte ASCII de un ejemplo de salto, dividido en los rectángulos mencionados anteriormente, y con espacios reemplazados por*
s:En la segunda línea, la opción
n
activa el recuento de todas las coincidencias, en lugar de encontrar la primera coincidencia. En la solución general, los espacios también pueden ser caracteres especiales fuera de entrada, y la opciónb
hace que la entrada se rellene con caracteres fuera de entrada.¡Espero que todo esto tenga sentido!
fuente