Reflexões ASCII em uma caixa

8

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 >= 1
  • x,ysão 1-indexed ( 1 <= x <= Wand 1 <= y <= H) ou 0-indexed ( 0 <= x < Wand 0 <= y < H), especifique qual indexação você escolheu
  • dx,dysão sempre um -1ou1

Entrada inválida pode ser ignorada.

Especificação de saída

  1. Não são permitidos espaços em branco à esquerda
  2. Espaços em branco à direita podem ser omitidos
  3. Espaços em branco à direita não são permitidos se não caberem na caixa
  4. 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 é , então o programa / função mais curto vence, mas qualquer esforço é apreciado.

ბიმო
fonte
Eu suspeito que uma das linguagens 2D (Turtle?) Possa se sair muito bem com esse desafio.
Draco18s não confia mais em SE
1
Seria permitido codificar os quatro valores possíveis de dx / dy como quatro números inteiros ímpares consecutivos? Quão importante é que xey sejam indexados 1?
Neil
Vou largar a 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.
ბიმო
Editado na indexação, você pode ser mais específico em sua outra pergunta?
#
1
Eu quero ver uma resposta de carvão para este lol.
Magic Octopus Urn

Respostas:

8

Carvão , 50 bytes

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

Experimente online! Link é a versão detalhada do código. Leva cinco entradas: w, h, x, y, a. xe ysão indexados a zero. arepresenta dxe de dyacordo com a seguinte codificação:

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

Explicação:

UONN 

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

JNN

Move o cursor para as coordenadas iniciais.

↷N

Gira para o ângulo inicial.

W⁼ KK«

Repete-se enquanto o quadrado atual for um espaço.

    *

Imprime um asterisco e avança na direção atual.

    ¿¬KK«

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.

        ¿¬KK«

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.

            ¿¬KK«

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.

Neil
fonte
1
Agradável! Aqui está um TIO para aqueles que querem experimentá-lo.
ბიმო
@BruceForte Obrigado, mas eu não queria vincular ao TIO até ter uma solução usando Peek()(o que eu faço agora).
1140 Neil
Ops, Peekfunciona novamente agora
somente ASCII
2

Calculadora Desmos - Não Competente para Ajudar Mais Conhecimento

Experimente online!

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

Intermediários:

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

Saídas:

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

Como 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.

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 )

Marca
fonte
Suponho que você já viu isso ?
ბიმო
Na verdade, eu nerd cortou e perdeu cerca de 4 dias do meu tempo em casa. Eu realmente gostei muito desse problema.
Mark #
De nada; P Além disso, 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]))

Experimente online!

Andrew Dunai
fonte
1
Agradável! Você pode salvar alguns bytes encurtando fx,fye substituindo Truepor algo como 1, veja aqui
27/17
@BruceForte thanks! Eu esqueci de substituí-los.
Andrew Dunai
1
-13 bytes , transformando-o em uma função.
Artemis ainda não confia
1
Espere, só vi quantos anos essa pergunta tem ... No entanto, cheguei aqui do HNQ ...
Artemis ainda não confia em SE