Resuelve este desafío de uHerbert

8

TL; DR : resuelva este desafío particular, una simulación de robot, pisando todas las almohadillas blancas y evitando las almohadillas grises. Puede pisar una almohadilla blanca varias veces, siempre y cuando pise cada almohadilla blanca al menos una vez. También se aceptarían soluciones en idiomas como Befunge con un puntero de instrucción 2D, pero H viene con el programa uHerbert y sus especificaciones de idioma se dan a continuación. No necesita el programa uHerbert para resolver esto, pero hace que verificar su solución sea mucho más fácil.

Así es como se ve el nivel. Esta es una cuadrícula de celdas de 25x25, en la que el robot y cada almohadilla blanca y gris ocupan una celda. El robot está inicialmente mirando hacia arriba.

ingrese la descripción de la imagen aquí

Antecedentes sobre uHerbert

Herbert es una simulación de robot que encontré por primera vez en el desafío de programación en línea IGF (Independent Games Festival) en 2008. Durante mucho tiempo, me decepcionó no poder probar los desafíos una vez que terminó el concurso real. Afortunadamente, alguien más debe haber leído mi mente y codificado este pequeño programa elegante : uHerbert (también conocido como mu-Herbert o micro-Herbert).

H (Especificaciones de idioma)

El programa es una simulación de robot, pero también actúa como intérprete para el lenguaje de programación H que solo sirve para mover el robot.

Hay tres instrucciones:

  • S: el robot avanza una celda hacia adelante
  • L: el robot gira a la izquierda 90 grados en su lugar
  • R: el robot gira 90 grados a la derecha en su lugar

Hay tres características de programación estándar a su disposición: funciones, parámetros y recursividad. Se admiten dos tipos de parámetros diferentes.

Parámetros numéricos

g(A):sslg(A-1)

Aquí, g es una función con un parámetro numérico. Este es el código de la placa de la caldera; después de esto, puede escribir su programa real llamando a su función y pasando un argumento:

g(4)

Esto llamaría a su función 4 veces, y la recursión termina automáticamente cuando su parámetro Aalcanza un valor de cero:

g(4) = sslg(4-1) = sslg(3) = sslsslg(2) = sslsslsslg(1) = sslsslsslssl

Parámetros funcionales

También puede usar parámetros funcionales, que básicamente solo reproducen las instrucciones que pasa:

f(A):rAlA

Entonces, si llama a esta función y pasa instrucciones, se evaluaría para:

f(ss) = rsslss
f(sslssr) = rsslssrlsslssr

Otra sintaxis

Las funciones pueden tener más de un parámetro y también pueden tener ambos tipos. Alternativamente, podrían no tener parámetros. Las siguientes son funciones válidas también:

j:ssss
k(A,B):Ajjjk(A,B-1)

Como puede ver, la función j no toma parámetros, y la función k toma ambos tipos de parámetros. A es un parámetro funcional y B es un parámetro numérico, como se describió anteriormente.

Recursión infinita

La recursión infinita también está permitida, pero solo se puede iniciar una vez y se termina de manera efectiva cuando se pisa la almohadilla blanca final (sin haber pisado ninguna almohadilla gris):

m:sslssrm

Resolver condición

El objetivo es hacer que el robot pise todas las almohadillas blancas y evitar pisar cualquiera de las almohadillas grises. Las almohadillas blancas se pueden pisar cualquier cantidad de veces, siempre que se pise cada una al menos una vez. El robot puede pisar cualquier punto de la cuadrícula que pueda alcanzar (algunos niveles tienen paredes de barrera y en este nivel las almohadillas grises actúan como una barrera).

El rompecabezas que se muestra anteriormente está disponible en el sitio anterior desde level_pack2.zip y se llama level3.txt . Tanto el programa uHerbert como el paquete de niveles todavía están disponibles en el enlace anterior a partir de hoy (el sitio ha sido archivado pero el motor de archivo todavía lo aloja), pero no son necesarios para una solución.

Me gustaría ver la solución más corta posible según el código de golf. Las soluciones en idiomas distintos de H no serán aceptadas como válidas. (Ciertamente sería interesante ver una solución de ejemplo en un lenguaje como Befunge donde el puntero de instrucción viaja en una cuadrícula 2D, pero según el puntaje de golf del código atómico, solo las instrucciones H pueden recibir una puntuación precisa. El puntero de instrucción podría tratarse como la posición del robot, por ejemplo.) Una solución válida es aquella en la que el robot pisa todas las almohadillas blancas (cada una al menos una vez) y no pisa ninguna almohadilla gris. Entrar en otras partes de la cuadrícula está bien, pero en este rompecabezas en particular no puedes hacerlo sin pisar una plataforma gris. La posición de inicio del robot no se puede cambiar.

También debo señalar que no se aceptarán soluciones que salten a una celda no adyacente. Esto no es posible para el robot en la simulación, y no representaría una solución válida. H no permite esto de todos modos. Por lo tanto, una solución válida debe estar compuesta de pasos individuales. Para cada celda en la cuadrícula, solo hay cuatro celdas adyacentes: las ortogonales a ella (arriba, abajo, a la izquierda y a la derecha). Por supuesto, esto no permitiría los pasos diagonales, pero como solo puede girar en incrementos de 90 grados, los pasos diagonales ni siquiera son posibles.

Si el robot recibe una instrucción que requiere que se mueva dentro de una barrera o fuera de la cuadrícula, el resultado es básicamente "derp": el robot golpea la pared y permanece donde está, y el puntero de la instrucción se mueve a la siguiente instrucción (el la instrucción se omite básicamente).

Nota sobre el tamaño de la solución

Cuando abra este nivel en el programa, notará que aparentemente es posible resolverlo en 13 bytes. Estoy totalmente desconcertado en cuanto a cómo es posible, y tengo curiosidad por ver qué tan cerca otros pueden llegar a eso. Mi solución más corta es 30 bytes en H. Si alguien quiere que lo publique, lo haré, pero me gustaría ver otras soluciones antes de publicar la mía. El programa también le da un puntaje, pero el puntaje es irrelevante para esta pregunta. Se aceptarán soluciones de cualquier puntaje.

Parece que el programa uHerbert no cuenta paréntesis o dos puntos como parte de su programa (verá esto cuando cuente sus bytes). Entonces, para los propósitos de esta pregunta, en el lenguaje H, los paréntesis y los dos puntos no contarán como bytes para su solución, ya que son principalmente delimitadores y de naturaleza puramente sintáctica en lugar de semántica.

Tim
fuente
Continuemos esta discusión en el chat .
Tim

Respuestas:

6

H, 13 bytes

a:ssr
b:sasaaab
b

Manifestación

animación

Anders Kaseorg
fuente
Inteligente. Recuerdo hurgar en este rompecabezas cuando se publicó por primera vez, pero no encontré esta solución.
Draco18s ya no confía en SE
Excelente trabajo. Esta es claramente la solución prevista.
Tim