Reflexões ASCII em uma caixa
Todos vocês provavelmente conhecem a Lei da Reflexão . Neste desafio, você visualizará a trajetória de uma bola em uma caixa.
Relacionados: Bola ASCII em animação de caixa e Rabiscos ASCII: Laser em uma caixa
Tarefa
Você é dado três pares de números inteiros W,H, x,ye dx,dy- a primeira representa o tamanho da caixa, a segunda posição inicial e o terceiro par é a direção em que a bola começa em movimento.
A tarefa é visualizar o movimento da bola até que ela pare de rolar, isso acontece assim que a bola está na posição anterior ou atinge um canto.
O personagem *deve visualizar a trajetória da bola e +marcar sua posição final; o restante da caixa deve consistir em (espaço em branco).
Exemplos
Para esclarecer um pouco, nesses exemplos _representará um espaço em branco. Além disso, os estágios intermediários estão aqui apenas para esclarecimentos; você precisará apenas produzir o último estágio; esses exemplos são 1indexados.
Dado W = 3, H = 5, x = 3, y = 2e dx = -1, dy = 1:
___ ___ ___ ___
__* __* __* __*
___ -> _*_ -> _*_ -> _+_
___ *__ *__ *_*
___ ___ _*_ _*_
- A bola começa no ponto
(3,2)e - se move na direção
(-1,1), bate na parede(1,4)e - é refletido, nova direção é
(1,1). Bate na parede novamente às(2,5) - onde fica refletido. A nova direção é
(1,-1)e atinge a parede imediatamente às(3,4), - novamente, ele se reflete na direção
(-1,-1). Agora ele viajaria através de pontos(2,3),(1,2), refletido etc., mas como já visitou a posição(2,3), para por aí.
Este exemplo demonstra o que acontece se uma bola bate em um canto. Para isso vamos W = 7, H = 3, x = 1, y = 3e dx = 1, dy = -1:
_______ __*____ __*____ __*___+
_______ -> _*_____ -> _*_*___ -> _*_*_*_
*______ *______ *___*__ *___*__
- A posição inicial é
(1,3), - a bola agora viaja na direção
(1,-1)até atingir a parede(3,1) - onde é refletido na nova direção
(1,1). - No
(5,3)que se reflete e viaja para a nova direção(1,-1). É uma parada abrupta(7,1)porque é uma esquina.
Dado W = 10, H = 6, x = 6, y = 6e dx = 1, dy = 1:
__________ __________ ________*_ ________*_ ________*_ __*_____*_ __*_____*_
__________ _________* _________* _______*_* _______*_* _*_____*_* _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________ _______*__ _______*__ _____*_*__ _*___*_*__ _*___*_*__ _*___+_*__
__________ ______*___ ______*___ ____*_*___ __*_*_*___ __*_*_*___ __*_*_*___
_____*____ _____*____ _____*____ ___*_*____ ___*_*____ ___*_*____ ___*_*____
Especificação de entrada
A entrada consiste de três pares de números inteiros W,H, x,ye dx,dy, você pode tirar a entrada em qualquer formato que faz mais sentido para a sua linguagem de programação e a ordem não importa. No entanto, a entrada aceita não deve codificar mais informações do que esses pares contêm (consulte esta resposta para um exemplo).
W,H >= 1x,ysão1-indexed (1 <= x <= Wand1 <= y <= H) ou0-indexed (0 <= x < Wand0 <= y < H), especifique qual indexação você escolheudx,dysão sempre um-1ou1
Entrada inválida pode ser ignorada.
Especificação de saída
- Não são permitidos espaços em branco à esquerda
- Espaços em branco à direita podem ser omitidos
- Espaços em branco à direita não são permitidos se não caberem na caixa
- Novas linhas à direita ( depois de todas as linhas relacionadas à saída) são permitidas
Vamos dar o primeiro exemplo:
(good by 2)
__*
_+ (good by 2)
*_*_ (bad by 3)
(bad by 4)
_*_
(good by 4)
Casos de teste
Supondo que a entrada tenha o formato (W,H,x,y,dx,dy)e 1-indexing tenha sido escolhido, aqui estão alguns casos de teste (novamente _aqui para representar espaços em branco!):
Entrada: 1,1,1,1,1,1
Resultado:
+
Entrada: 3,3,3,3,1,1
Resultado:
___
___
__+
Entrada: 3,3,3,3, -1, -1
Resultado:
+__
_*_
__*
Entrada: 7,3,1,3,1, -1
Resultado:
__*___+
_*_*_*_
*___*__
Entrada: 10,6,6,6,1,1
Resultado:
__*_____*_
_*_*___*_*
*___*_*_*_
_*___+_*__
__*_*_*___
___*_*____
Entrada: 21,7,6,4, -1, -1
Resultado:
__*_______*_______*__
_*_*_____*_*_____*_*_
*___*___*___*___*___*
_*___*_*_____*_*___*_
__*___*_______+___*__
___*_*_________*_*___
____*___________*____
Isso é código-golfe , então o programa / função mais curto vence, mas qualquer esforço é apreciado.
1restrição indexada, se você gostar (?) Sobre a primeira pergunta, não sei o que você quer dizer, mas parece bom. Eu acho que qualquer coisa que seja uma bijection ( {-1,1}x{-1,1} ≡ "Your space") seria boa.