Reflexiones ASCII en una caja

8

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,yy dx,dyel 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 1indexados.


Dado W = 3, H = 5, x = 3, y = 2y 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 = 3y 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 = 6y dx = 1, dy = 1:

__________    __________    ________*_    ________*_    ________*_    __*_____*_    __*_____*_
__________    _________*    _________*    _______*_*    _______*_*    _*_____*_*    _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________    _______*__    _______*__    _____*_*__    _*___*_*__    _*___*_*__    _*___+_*__
__________    ______*___    ______*___    ____*_*___    __*_*_*___    __*_*_*___    __*_*_*___
_____*____    _____*____    _____*____    ___*_*____    ___*_*____    ___*_*____    ___*_*____

Especificación de entrada

La entrada consta de los tres pares de enteros W,H, x,yy dx,dypuede 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,yestán 1indexados ( 1 <= x <= Wy 1 <= y <= H) o 0indexados ( 0 <= x < Wy 0 <= y < H), especifique qué indexación eligió
  • dx,dyson siempre -1o1

La entrada inválida puede ser ignorada.

Especificación de salida

  1. No se permiten espacios en blanco iniciales
  2. Los espacios en blanco finales pueden omitirse
  3. Los espacios en blanco finales no están permitidos si no se ajustan a la caja
  4. 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 1se 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 , por lo que gana el programa / función más corto, pero se aprecia cualquier esfuerzo.

ბიმო
fuente
Sospecho que uno de los lenguajes 2D (¿Turtle?) Podría funcionar realmente bien con este desafío.
Draco18s ya no confía en SE
1
¿Se permitiría codificar los cuatro posibles valores dx / dy como cuatro enteros impares consecutivos? ¿Qué tan importante es que x e y estén indexados en 1?
Neil
Me pasaré la 1restricció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.
ბიმო
Editado en la indexación, ¿puedes ser más específico en tu otra pregunta?
ბიმო
1
Quiero ver una respuesta de carbón para esta jajaja.
Magic Octopus Urn

Respuestas:

8

Carbón de leña , 50 bytes

UONN JNN↷NW⁼ KK«*¿¬KK«↷²¶*¿¬KK«↷²¶↷²*¿¬KK«↷²¶»»»»+

Pruébalo en línea! El enlace es a la versión detallada del código. Toma cinco entradas: w, h, x, y, a. xy yestán indexados a cero. arepresenta dxy de dyacuerdo con la siguiente codificación:

a mod 8 == 1 => dx = 1, dy = 1
a mod 8 == 3 => dx = -1, dy = 1
a mod 8 == 5 => dx = -1, dy = -1
a mod 8 == 7 => dx = 1, dy = -1

Explicación:

UONN 

(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).

JNN

Mueve el cursor a las coordenadas iniciales.

↷N

Rota al ángulo inicial.

W⁼ KK«

Se repite siempre que el cuadrado actual sea un espacio.

    *

Imprime un asterisco y avanza en la dirección actual.

    ¿¬KK«

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.

        ¿¬KK«

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.

            ¿¬KK«

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.

Neil
fuente
1
¡Agradable! Aquí hay un TIO para aquellos que quieran probarlo.
ბიმო
@BruceForte Gracias, pero no quería vincularme a TIO hasta que tuviera una solución usando Peek()(lo que hago ahora).
Neil
Vaya, Peekfunciona de nuevo ahora
solo ASCII
2

Calculadora Desmos - No compite para ayudar a un mayor conocimiento

Pruébalo en línea!

Entradas:

X as X position to Start
Y as Y position to Start
s as slope -> -1 for dX/dY = -1, +1 for dX/dY = +1
h as height of box, with 0-indexing
w as width of box, with 0-indexing

Intermedios:

Let b = gcd(h,w),  
Let c = |b-(X-sY)%2b| Or |b-mod(X-sY,2b)|

Fórmula, abreviada:

(|b-(x+y)%2b|-c)(|b-(x-y)%2b|-c)=0

Salidas:

x as x position, 0-indexed, where the ball will land when released
y as y position, 0-indexed, where the ball will land when released

Cómo funciona:

(|b-(x+y)%2b|-c)*(|b-(x-y)%2b|-c)=0
                ^ OR operation - |b-(x+y)%2b|-c=0 or |b-(x-y)%2b|-c=0
|b-(x+/-y)%2b|-c = 0
|b-(x+/-y)%2b| = c
|b-(x+/-y)%2b| = c means (b-(x+/-y))%2b = + or -c 
b-(x+/-y)%2b = +/- c -> b +/- c = (x+/-y)%2b -> (x+/-y) = n*2*b + b +/- c 
Where n is integer.  This will force patterns to repeat every 2b steps in x and y.  
Initial pattern n=0: (x +/- y) = b +/- c -> y = +/- x + b +/- c
In the x positive and y positive plane only, these correspond to lines of positive and 
negative slope, set at intercept b, offset by c on either side.

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 )

marca
fuente
¿Supongo que has visto esto ?
ბიმო
En realidad, me auto nerd francotirado y perdí unos 4 días de mi tiempo en casa. Realmente me gustó mucho este problema.
Mark
De nada; P También, relevante .
ბიმო
1

Python 3 , 293 279 bytes

w,h,x,y,i,j=map(int,input().split());x-=1;y-=1;l=[x[::]for x in[[' ']*w]*h]
while 1:
 a,b=((x,i)in[(0,-1),(w-1,1)]),((y,j)in[(0,-1),(h-1,1)])
 if a and b or l[y][x]!=' ':l[y][x]='+';break
 i,j=i*(-a*2+1),j*(-b*2+1);l[y][x]='*';x+=i;y+=j
print('\n'.join([''.join(x) for x in l]))

Pruébalo en línea!

Andrew Dunai
fuente
1
¡Agradable! Puede guardar algunos bytes acortando fx,fyy reemplazando Truepor algo como 1, ver aquí
ბიმო
@BruceForte gracias! Olvidé reemplazarlos.
Andrew Dunai
1
-13 bytes convirtiéndolo en una función.
Artemisa todavía no confía en SE
1
Espera, acabo de ver cuántos años tiene esta pregunta ... Sin embargo, llegué aquí desde HNQ ...
Artemis todavía no confía en SE