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,y
e 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 1
indexados.
Dado W = 3, H = 5
, x = 3, y = 2
e 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 = 3
e 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 = 6
e dx = 1, dy = 1
:
__________ __________ ________*_ ________*_ ________*_ __*_____*_ __*_____*_
__________ _________* _________* _______*_* _______*_* _*_____*_* _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________ _______*__ _______*__ _____*_*__ _*___*_*__ _*___*_*__ _*___+_*__
__________ ______*___ ______*___ ____*_*___ __*_*_*___ __*_*_*___ __*_*_*___
_____*____ _____*____ _____*____ ___*_*____ ___*_*____ ___*_*____ ___*_*____
Especificação de entrada
A entrada consiste de três pares de números inteiros W,H
, x,y
e 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 >= 1
x,y
são1
-indexed (1 <= x <= W
and1 <= y <= H
) ou0
-indexed (0 <= x < W
and0 <= y < H
), especifique qual indexação você escolheudx,dy
são sempre um-1
ou1
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.
1
restriçã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.Respostas:
Carvão , 50 bytes
Experimente online! Link é a versão detalhada do código. Leva cinco entradas:
w
,h
,x
,y
,a
.x
ey
são indexados a zero.a
representadx
e dedy
acordo com a seguinte codificação:Explicação:
(observe o espaço à direita) Preenche o fundo com espaços para a largura e altura de entrada. (Normalmente, cada quadrado do plano de fundo é uma sequência vazia, que é convertida em um espaço na saída.)
Move o cursor para as coordenadas iniciais.
Gira para o ângulo inicial.
Repete-se enquanto o quadrado atual for um espaço.
Imprime um asterisco e avança na direção atual.
Se o cursor se mover fora do oblongo original,
Gire a direção e imprima uma nova linha (que nos leva de volta ao quadrado anterior) e um asterisco, que se move na nova direção.
Se o cursor se afastar do oblongo original,
Leve o cursor de volta ao quadrado anterior e gire novamente, imprimindo o asterisco na outra direção.
Se o cursor ainda estiver fora do oblongo, devemos estar em um canto.
Então volte para a praça anterior e desista.
Quando não pudermos mais nos mover, imprima um sinal de "+" e pare.
fonte
Peek()
(o que eu faço agora).Peek
funciona novamente agoraCalculadora Desmos - Não Competente para Ajudar Mais Conhecimento
Experimente online!
Entradas:
Intermediários:
Fórmula, abreviada:
Saídas:
Como funciona:
O programa falha em atender ao critério final - parando no ponto de interseção e marcando com um +, sendo enviado como não competitivo para obter informações para ajudar outras pessoas a concluir o desafio. Observe que, para que o Desmos funcione quando c = 0 ou c = b, um pequeno fator de deslocamento de 0,01 foi introduzido, pois o Desmos parece ter limites de Mod (A, B) de (0, B) em vez de [0, B )
fonte
Python 3 ,
293279 bytesExperimente online!
fonte
fx,fy
e substituindoTrue
por algo como1
, veja aqui