Reflexiones ASCII en una caja
Probablemente todos conozcan la Ley de la Reflexión , en este desafío visualizarán la trayectoria de una pelota en una caja.
Relacionado: Animación ASCII Ball in Box y ASCII Doodling: Laser in a Box
Tarea
Te dan tres pares enteros W,H
, x,y
y dx,dy
el primero representa el tamaño de la caja, el segundo la posición inicial y el tercer par es la dirección en la que la pelota comienza a moverse.
La tarea es visualizar el movimiento de la pelota hasta que deja de rodar, esto sucede tan pronto como la pelota está en una posición que estaba antes o toca una esquina.
El personaje *
deberá visualizar la trayectoria de la pelota y +
marcar su posición final, el resto del cuadro debe consistir en (espacio en blanco).
Ejemplos
Para exponerlo un poco más claro, en estos ejemplos _
representará un espacio en blanco. Además, las etapas intermedias solo están aquí para aclarar, solo tendrá que generar la última etapa, estos ejemplos están 1
indexados.
Dado W = 3, H = 5
, x = 3, y = 2
y dx = -1, dy = 1
:
___ ___ ___ ___
__* __* __* __*
___ -> _*_ -> _*_ -> _+_
___ *__ *__ *_*
___ ___ _*_ _*_
- La pelota comienza en el punto
(3,2)
y - se mueve en dirección
(-1,1)
, golpea la pared(1,4)
y - se refleja, nueva dirección es
(1,1)
. Golpea la pared nuevamente a las(2,5)
- donde se pone se refleja. La nueva dirección es
(1,-1)
y golpea la pared inmediatamente en(3,4)
, - nuevamente se refleja en la dirección
(-1,-1)
. Ahora viajaría a través de puntos(2,3),(1,2)
, reflejados, etc. pero como ya visitó la posición,(2,3)
se detiene allí.
Este ejemplo demuestra qué sucede si una pelota golpea una esquina. Para esto deja W = 7, H = 3
, x = 1, y = 3
y dx = 1, dy = -1
:
_______ __*____ __*____ __*___+
_______ -> _*_____ -> _*_*___ -> _*_*_*_
*______ *______ *___*__ *___*__
- La posición de inicio es
(1,3)
, - la pelota ahora viaja en dirección
(1,-1)
hasta que golpea la pared en(3,1)
- donde se refleja en la nueva dirección
(1,1)
. - En
(5,3)
esto se refleja y viaja en la nueva dirección(1,-1)
. Se detiene abruptamente(7,1)
porque es una esquina.
Dado W = 10, H = 6
, x = 6, y = 6
y dx = 1, dy = 1
:
__________ __________ ________*_ ________*_ ________*_ __*_____*_ __*_____*_
__________ _________* _________* _______*_* _______*_* _*_____*_* _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________ _______*__ _______*__ _____*_*__ _*___*_*__ _*___*_*__ _*___+_*__
__________ ______*___ ______*___ ____*_*___ __*_*_*___ __*_*_*___ __*_*_*___
_____*____ _____*____ _____*____ ___*_*____ ___*_*____ ___*_*____ ___*_*____
Especificación de entrada
La entrada consta de los tres pares de enteros W,H
, x,y
y dx,dy
puede tomar la entrada en cualquier formato que tenga más sentido para su lenguaje de programación y el orden no importa. Sin embargo, la entrada aceptada no debe codificar más información de la que contienen estos pares (consulte esta respuesta para ver un ejemplo).
W,H >= 1
x,y
están1
indexados (1 <= x <= W
y1 <= y <= H
) o0
indexados (0 <= x < W
y0 <= y < H
), especifique qué indexación eligiódx,dy
son siempre-1
o1
La entrada inválida puede ser ignorada.
Especificación de salida
- No se permiten espacios en blanco iniciales
- Los espacios en blanco finales pueden omitirse
- Los espacios en blanco finales no están permitidos si no se ajustan a la caja
- Se permiten nuevas líneas finales ( después de todas las líneas relacionadas con la salida)
Tomemos el primer ejemplo:
(good by 2)
__*
_+ (good by 2)
*_*_ (bad by 3)
(bad by 4)
_*_
(good by 4)
Casos de prueba
Suponiendo que la entrada tiene el formato (W,H,x,y,dx,dy)
y 1
se eligió la indexación, aquí hay algunos casos de prueba (¡nuevamente _
está aquí para representar espacios en blanco!):
Entrada: 1,1,1,1,1,1
Salida:
+
Entrada: 3,3,3,3,1,1
Salida:
___
___
__+
Entrada: 3,3,3,3, -1, -1
Salida:
+__
_*_
__*
Entrada: 7,3,1,3,1, -1
Salida:
__*___+
_*_*_*_
*___*__
Entrada: 10,6,6,6,1,1
Salida:
__*_____*_
_*_*___*_*
*___*_*_*_
_*___+_*__
__*_*_*___
___*_*____
Entrada: 21,7,6,4, -1, -1
Salida:
__*_______*_______*__
_*_*_____*_*_____*_*_
*___*___*___*___*___*
_*___*_*_____*_*___*_
__*___*_______+___*__
___*_*_________*_*___
____*___________*____
Este es el código de golf , por lo que gana el programa / función más corto, pero se aprecia cualquier esfuerzo.
1
restricción -indexed si te gusta (?) Sobre la primera pregunta, no está seguro de lo que quieres decir pero suena bien. Supongo que cualquier cosa que sea una biyección ({-1,1}x{-1,1} ≡ "Your space"
) sería buena.Respuestas:
Carbón de leña , 50 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Toma cinco entradas:
w
,h
,x
,y
,a
.x
yy
están indexados a cero.a
representadx
y dedy
acuerdo con la siguiente codificación:Explicación:
(nota espacio final) Rellena el fondo con espacios al ancho y alto de entrada. (Normalmente, cada cuadrado del fondo es una cadena vacía, que luego se convierte en un espacio en la salida).
Mueve el cursor a las coordenadas iniciales.
Rota al ángulo inicial.
Se repite siempre que el cuadrado actual sea un espacio.
Imprime un asterisco y avanza en la dirección actual.
Si el cursor se movió fuera del oblongo original,
Gire la dirección, luego imprima una nueva línea (que convenientemente nos lleva de vuelta al cuadrado anterior) y un asterisco, que se mueve en la nueva dirección.
Si el cursor retrocedió fuera del oblongo original,
Vuelva a colocar el cursor en el cuadrado anterior, luego gire nuevamente, imprimiendo el asterisco en la otra dirección.
Si el cursor todavía está fuera del oblongo, debemos estar en una esquina.
Así que vuelve a la casilla anterior y ríndete.
Cuando ya no podamos movernos, imprima un signo "+" y pare.
fuente
Peek()
(lo que hago ahora).Peek
funciona de nuevo ahoraCalculadora Desmos - No compite para ayudar a un mayor conocimiento
Pruébalo en línea!
Entradas:
Intermedios:
Fórmula, abreviada:
Salidas:
Cómo funciona:
El programa no cumple con el criterio final: detenerse en el punto de intersección y marcar con un signo +, por lo que se presenta como información no competitiva para ayudar a otros a completar el desafío. Tenga en cuenta que para que Desmos funcione cuando c = 0 o c = b, se introdujo un pequeño factor de compensación de 0.01, ya que Desmos parece tener límites de Mod (A, B) de (0, B) en lugar de [0, B )
fuente
Python 3 ,
293279 bytesPruébalo en línea!
fuente
fx,fy
y reemplazandoTrue
por algo como1
, ver aquí