Fondo
¡Despierta para encontrarse perdido en un laberinto unidimensional! Aparece un genio místico (o algo así) y explica que la salida se encuentra frente a usted, pero que entre usted y la salida hay una serie de desafíos. A medida que avanzas, te das cuenta de que todos los llamados desafíos son simplemente puertas cerradas. Primero ve una puerta con un orificio para llave en forma de T, y al no tener esa llave usted mismo, vuelva sobre sus pasos, buscando una llave con T
forma.
Frustrado, encuentras una sopa de llaves del alfabeto en el suelo, ninguna de las cuales coincide con la puerta que has encontrado. Por algún golpe de genio (o idiotez), decides que la t
tecla en forma de minúscula podría caber en la ranura si la atascas con suficiente fuerza. Cuando te acercas a la puerta con la t
llave en minúscula en la mano, el T
agujero se ilumina en verde y la puerta se disuelve frente a ti.
Uno menos, quedan muchos más ...
Reto
El objetivo de este desafío es marcar cuántos pasos te lleva salir del laberinto.
La entrada de este desafío es el laberinto: una cadena que contiene solo caracteres [A-Za-z^$ ]
. Glosario:
^
- El espacio de inicio. La entrada contendrá exactamente uno^
.$
- La salida (¡libertad!). La entrada contendrá exactamente uno$
.[A-Z]
- Las letras mayúsculas significan puertas. Solo puede pasar por esta puerta si ya ha recogido la clave requerida.[a-z]
- Las letras minúsculas significan claves. Recoge estas llaves caminando sobre el espacio que contiene la llave.
Habrá como máximo una de cada letra mayúscula en la entrada. Esto significa que el número total de puertas estará entre 0 y 26 inclusive.
Cada puerta cerrada [A-Z]
tendrá exactamente una tecla de minúscula correspondiente [a-z]
. Puede haber cualquier número de espacios ( ) en la entrada.
Todas las puertas estarán a la derecha del inicio y a la izquierda de la salida. Por lo tanto, no habrá puertas superfluas. Todas las entradas serán solucionables.
La salida para este desafío será un número, el número de pasos que tomó para salir del laberinto.
Algoritmo
Su enfoque metódico para salir de este miserable lugar es el siguiente:
- Comience desde el principio (
^
) y avance (derecha) recogiendo las claves que encuentre. - Cuando cruzas una puerta, si tienes la llave correcta, avanzas hacia la puerta. Si no tiene la llave correcta, camina hacia atrás (izquierda) recogiendo las llaves que encuentra hasta que encuentra la llave de la puerta más reciente que no pudo abrir.
- Una vez que recoja la llave de la puerta problemática actual, gire hacia la derecha y continúe.
- Repita este proceso hasta que salga a la salida (
$
).
Los golfistas experimentados entenderán que su código no tiene que implementar este algoritmo específico siempre que genere el mismo resultado que si hubiera ejecutado este algoritmo.
Contando
Cada vez que pasas de un cuadro a otro, eso cuenta como un paso. Girar 180º no implica ningún paso adicional. No puede avanzar hacia una puerta sin la llave requerida. Debes pisar una llave para recogerla, y debes pisar la salida para ganar. Después de su primer movimiento, el espacio de inicio ( ^
) se comporta como cualquier otro espacio regular.
Ejemplos
En estos ejemplos, dejé los espacios como subrayados para la legibilidad humana.
Entrada es _a_^_A__$__
. La salida es 11
. Da un 1
paso adelante, nota que no tiene llave para la A
puerta, y luego sobre la cara. Camina hacia atrás hasta que ocupe el espacio que contiene los a
( 3
pasos hacia atrás, ahora 4
total). Luego camina hacia adelante hasta que ocupe el espacio que contiene la salida ( 7
pasos hacia adelante, 11
total).
Entrada es b__j^__a_AJB_$
. La salida es 41
: Realiza dos viajes separados a la parte posterior del laberinto, uno para obtener la j
clave y el siguiente para obtener la b
clave.
Entrada es __m__t_^__x_T_MX_$____
. La salida es 44
. No hará ningún viaje adicional para obtener la x
llave, ya que la recogió en su camino desde el principio hasta la puerta T
.
Entrada es g_t_^G_T$
. La salida es 12
. No puedes moverte al G
espacio sin una llave, e inmediatamente sobre la cara. Tienes la suerte de recoger la t
llave en el camino a la g
llave, y así abrir ambas puertas en tu camino hacia la libertad.
Entrada es _^_____$
. La salida es 6
. Eso fue fácil.
Pautas de E / S y criterio ganador
Se aplican las reglas estándar de E / S. Este es un desafío de código de golf .
A
enbA^aB$
que no sería superfluo tampoco. ;)Respuestas:
CJam, 45
Pruébalo en línea
Explicación:
fuente
Pyth, 51 bytes
Sume la distancia entre la puerta y su llave (doblada, para hacer el viaje de ida y vuelta), ignorando las llaves "anidadas" y la distancia desde el principio hasta el final:
mismo algoritmo en python2.7:
fuente
Python 2,
155154134128 bytesEditar: ¡Gracias a @ user2357112 y @loovjo por sus comentarios que me ayudaron a eliminar otros
2026 bytes de mi solución!fuente
i
es innecesario?i
rastrea la posición de la puerta que se está procesando actualmente, y se requiere si su llave aún no se ha recogido (es decir, sik
la posición de la llave es menor quef
la más a la izquierda que hemos caminado, entonces debemos agregar2*(i-k-1)
pasos a nuestro total (caminando a la izquierda para obtener la llave, y caminando de regreso a la puerta) ...i
ser reemplazado porl.index(d)
en la quinta línea y la tarea eliminada en la cuarta?e
yf
parecen redundantes. Además, puede guardar un montón de caracteres al guardarl.index
en una variable.x
es redundante también. Supongo que mi novato de golf está mostrando :) ¡Gracias por la ayuda!C, 136 bytes
fuente
PHP 5.3, 123 bytes
Esta es mi primera publicación en Code Golf, espero que sea de una calidad de golf lo suficientemente alta como para una primera publicación. ¡Definitivamente un desafío divertido y una pregunta increíble!
Este programa abusa del hecho de que PHP no necesita que declare previamente ninguna variable antes de usarla.
También resultó ser un par de bytes más corto en mi solución final para comenzar en 0 y restablecer el conteo de pasos cuando se encuentra el carácter de inicio, en lugar de comenzar en '^'.
¡Cualquier sugerencia es definitivamente bienvenida!
fuente
JavaScript (ES6), 110 bytes
Puerto de la respuesta de @ Rob's Pyth.
fuente
Python 2.7,
234199179fuente
AWK, 174 Bytes
Probablemente haya un algoritmo más estricto, pero esto es lo que se me ocurrió.
Tenga en cuenta que estoy usando
gawk
. Algunas implementaciones deAWK
pueden no dividir una cadena de""
esta manera.fuente
C #, 309 bytes
Versión sin golf:
No hay nada lujoso aquí, solo recorre la cadena y cambia la dirección según el carácter y si la clave está contenida en una cadena de teclas.
m = la cadena del laberinto
k = la cadena de teclas
f = la dirección (verdadero es hacia adelante en el laberinto)
b = la clave para buscar al retroceder
c = marcador de posición para m [j] para guardar algunos bytes debido al uso frecuente
j = el índice de caracteres de la cadena para mirar
t = el recuento
Todavía es relativamente nuevo en el golf, así que si ves en algún lugar puedo adelgazar, ¡házmelo saber!
fuente