Uma sala de espelhos

18

(Esse desafio é muito semelhante, mas esse desafio atual tem complicações adicionais.)


Imagine uma sala bidimensional, onde as paredes são revestidas com espelhos planos.

De repente, um feixe de luz atinge a sala, onde um pedaço de parede está faltando! O raio de luz dança ao redor da sala, sendo refletido pelos espelhos da parede e, eventualmente, saindo da sala novamente.

A lógica

Está dada 5 variáveis: W, H, X, Y e Z .
Agora, o que eles significam?

W, H é o tamanho da sala (incluindo as paredes), com W sendo largura e H sendo altura.
X, Y é a coordenada em que a parede tem o furo. Você pode supor que isso esteja sempre localizado em um revestimento de parede. As coordenadas são baseadas em 0, com o eixo X apontando para a direita e o eixo Y apontando para baixo.
Z é um caractere único, representando a direção em que a luz cai na sala, seja \ou /.

A sala deve ser constituída pelos seguintes caracteres:

  • | para parede horizontal
  • - para parede vertical
  • + para cantos

Exemplo: (W = 7, H = 4)

+-----+
|     |
|     |
+-----+

Agora que temos um quarto, vamos destruir um dos azulejos, para que um feixe de luz caia no quarto. Feixes de luz são linhas diagonais, representadas por \e /caracteres.

Vamos substituir o revestimento de parede em X = 2, Y = 0 por um \feixe de luz.

+-\---+
|     |
|     |
+-----+

A luz que entra viaja na diagonal pela sala até atingir a parede do espelho. Se uma parede é atingida, a direção inverte-se ao longo do eixo da parede e o feixe viaja.

+-\---+
|\ \/\|
| \/\/|
+-----+

Neste exemplo, o feixe de luz chega a um ponto em que um canto da parede é atingido, o que provoca que o feixe seja revertido completamente e viaje todo o caminho de volta, eventualmente saindo da sala.

Sua tarefa

Escreva um programa que imprima a sala e todo o caminho do feixe de luz, até que saia da sala novamente ou se repita em um loop infinito.

Entrada

A entrada pode ser recebida em qualquer formato razoável, mas deve incluir os 4 números inteiros W, H, X, Y e o caractere Z, por exemplo [10, 8, 0, 3, \].

Você pode assumir que:

  • W, H> = 3
  • X, Y estão sempre localizados em uma parede
  • Z só poderá conter os valores \e /.

Resultado

Você pode decidir se retorna uma sequência ou saída diretamente para stdout.
Ele deve incluir a parede da sala e o feixe de luz (definido pelos caracteres ASCII acima).

Regras

  • As brechas padrão são proibidas.
  • Isso é , então o código mais curto em bytes, em qualquer idioma, vence.
  • Todas as linguagens de codificação criadas antes da publicação deste desafio são permitidas.

Exemplos

Entrada: [5, 4, 2, 0, /]

+-/-+
|/ /|
|\/ |
+---+

Entrada: [20, 3, 0, 1, \]

+------------------+
\/\/\/\/\/\/\/\/\/\|
+------------------+

Entrada: [10, 8, 0, 3, \] (Exemplo de um loop infinito que não sai da sala novamente.)

+--------+
|/\/\/\/\|
|\/\/\/\/|
\/\/\/\/\|
|\/\/\/\/|
|/\/\/\/\|
|\/\/\/\/|
+--------+

Boa sorte!

Ian H.
fonte

Respostas:

5

Carvão , 55 bytes

BNNJNNPψ↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1W¬℅KK«¹F³¿∧κ℅KK«↷κ¶↷κ

Experimente online! Link é a versão detalhada do código. Edit: Eu não sei por que, mas esse código não está funcionando no momento. Aqui está uma versão aprimorada. Explicação do código original:

BNN

Desenhe a caixa externa.

JNNPψ

Mova o cursor para o ponto de entrada e faça um orifício na caixa nesse ponto, para que isso se torne o plano de fundo.

↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1P

Gire para a direção apropriada para imprimir o segmento de linha inicial.

W¬℅KK«¹

Enquanto o cursor estiver sobre um furo, desenhe o próximo segmento de linha.

F³¿∧κ℅KK«↷κ¶↷κ

Procure um furo para desenhar o próximo segmento de linha. Isso funciona repetindo o mesmo código três vezes. A primeira vez, nada acontece. Na segunda vez, se o cursor não estiver sobre um buraco, ele gira 45 ° para a direita, depois dá um passo para a direita e depois gira para a direita 45 °. Isso tem o efeito de refleti-lo em um eixo. Na terceira vez, se o cursor ainda não estiver sobre um furo, ele gira 90 ° para a direita, dá um passo para a direita e gira 90 ° para a direita. Isso tem o efeito de alterar a reflexão para o outro eixo. Se ainda não houver um buraco, um canto ou loop infinito será alcançado, portanto o loop externo será interrompido.

Neil
fonte
1
Para que as pessoas testem seu código funciona, seria bom ter um link para o código golfado online, com a versão detalhada separadamente.
Trichoplax
@trichoplax que foi fácil
MD XF
@trichoplax O link TIO faz realmente mostra o código golfed na saída, que é onde eu copiar e colá-lo a partir de ...
Neil
1
@trichoplax Quando você usa -v -sl, na verdade, é o código sucinto traduzido, impresso, que é executado. Obviamente, isso depende do deverbosifier gerar o código sucinto correto, porque, se isso não acontecer, o código gerado falhará, mesmo que o código detalhado original estivesse tecnicamente correto.
Neil