Una sala de espejos

18

(Este desafío es muy similar, pero este desafío actual tiene complicaciones adicionales).


Imagine una habitación bidimensional, donde las paredes están chapadas con espejos planos.

De repente, un rayo de luz incide en la habitación, donde falta un pedazo de pared. El rayo de luz baila alrededor de la habitación, se refleja en los espejos de las paredes y, finalmente, sale de la habitación nuevamente.

La lógica

Se le da 5 variables: W, H, X, Y y Z .
Ahora, ¿qué significan?

W, H es el tamaño de la habitación (incluidas las paredes), siendo W ancho y H altura.
X, Y es la coordenada en la que el muro tiene el agujero. Puede suponer que esto siempre se encuentra en una baldosa de pared. Las coordenadas están basadas en 0, con el eje X apuntando hacia la derecha y el eje Y apuntando hacia abajo.
Z es un solo personaje, que representa la dirección en que la luz cae en la habitación, ya sea \o /.

La sala debe estar formada por los siguientes personajes:

  • | para paredes horizontales
  • - para paredes verticales
  • + para rincones

Ejemplo: (W = 7, H = 4)

+-----+
|     |
|     |
+-----+

Ahora que tenemos una habitación, destruyamos uno de los azulejos de la pared, para que un rayo de luz caiga en la habitación. Los rayos de luz son líneas diagonales, representadas por \y /caracteres.

Reemplacemos el azulejo de la pared en X = 2, Y = 0 con un \haz de luz.

+-\---+
|     |
|     |
+-----+

La luz entrante viaja diagonalmente a través de la habitación hasta que golpea una pared de espejo. Si se golpea una pared, la dirección se invierte a lo largo del eje de la pared y la viga se desplaza.

+-\---+
|\ \/\|
| \/\/|
+-----+

En este ejemplo, el rayo de luz llega a un punto donde se golpea una esquina de la pared, lo que inflige que el rayo se invierte por completo y viaja hacia atrás, y finalmente sale de la habitación.

Tu tarea

Escriba un programa que imprima la habitación y el camino completo del haz de luz, hasta que salga de la habitación nuevamente o se repita en un bucle infinito.

Entrada

La entrada puede recibirse en cualquier formato razonable, pero debe incluir los 4 enteros W, H, X, Y y el carácter Z, por ejemplo [10, 8, 0, 3, \].

Puede suponer que:

  • W, H> = 3
  • X, Y siempre se encuentran en una pared
  • Z solo podrá contener los valores \y /.

Salida

Puede decidir si devuelve una cadena o directamente a la salida stdout.
Tiene que incluir la pared de la habitación y el haz de luz (definido por los caracteres ASCII anteriores).

Reglas

  • Las lagunas estándar están prohibidas.
  • Este es el , por lo que gana el código más corto en bytes, en cualquier idioma.
  • Todos los lenguajes de codificación que se crearon antes de la publicación de este desafío están permitidos.

Ejemplos

Entrada: [5, 4, 2, 0, /]

+-/-+
|/ /|
|\/ |
+---+

Entrada: [20, 3, 0, 1, \]

+------------------+
\/\/\/\/\/\/\/\/\/\|
+------------------+

Entrada: [10, 8, 0, 3, \] (Ejemplo de un bucle infinito que no volverá a salir de la habitación).

+--------+
|/\/\/\/\|
|\/\/\/\/|
\/\/\/\/\|
|\/\/\/\/|
|/\/\/\/\|
|\/\/\/\/|
+--------+

¡Buena suerte!

Ian H.
fuente

Respuestas:

5

Carbón , 55 bytes

BNNJNNPψ↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1W¬℅KK«¹F³¿∧κ℅KK«↷κ¶↷κ

Pruébalo en línea! El enlace es a la versión detallada del código. Editar: No sé por qué, pero ese código no está funcionando en este momento. Aquí hay una versión modificada en su lugar. Explicación del código original:

BNN

Dibuja la caja exterior.

JNNPψ

Mueva el cursor al punto de entrada y haga un agujero en el cuadro en este punto, para que se convierta en el fondo.

↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1P

Gire en la dirección adecuada para imprimir el segmento de línea inicial.

W¬℅KK«¹

Mientras el cursor está sobre un agujero, dibuje el siguiente segmento de línea.

F³¿∧κ℅KK«↷κ¶↷κ

Busque un agujero en el que dibujar el siguiente segmento de línea. Esto funciona repitiendo el mismo código tres veces. La primera vez, no pasa nada. La segunda vez, si el cursor no está sobre un agujero, gira 45 ° hacia la derecha, luego da un paso hacia la derecha, luego gira 45 ° hacia la derecha. Esto tiene el efecto de reflejarlo en un eje. La tercera vez, si el cursor aún no está sobre un agujero, gira 90 ° hacia la derecha, luego da un paso hacia la derecha y luego gira 90 ° hacia la derecha. Esto tiene el efecto de cambiar la reflexión al otro eje. Si todavía no hay un agujero, se ha alcanzado una esquina o un bucle infinito, por lo que el bucle externo se detiene.

Neil
fuente
1
Para que las personas prueben que su código funciona, sería útil tener un enlace al código de golf en línea, con la versión detallada por separado.
trichoplax
@trichoplax que fue fácil
MD XF
@trichoplax El enlace TIO realmente muestra el código de golf en la salida, que es donde copio y pego ...
Neil
1
@trichoplax Cuando lo usas -v -sl, en realidad es el código sucinto traducido que se imprime el que se ejecuta. Esto, por supuesto, depende de que el desverbosificador genere un código sucinto correcto, porque si no lo hace, entonces el código generado falla, a pesar de que el código detallado original era técnicamente correcto.
Neil