E se tivermos um corredor composto por dois espelhos paralelos?
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
Agora, apontamos um laser para baixo ...
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \|
| /|
| / |
Veja. Ele saltou, no final, lá.
E se nós desenharmos dois lasers, mas indo na direção oposta?
| \ / |
| \ / |
| \/ |
| /\ |
| / \ |
| / \ |
| / \ |
|/ \|
|\ /|
| \ / |
Hmm, eles não pareciam se encontrar lá. Isso é conveniente. O que acontece se os dois lasers ocuparem o mesmo espaço?
| \ / |
| \ / |
| \ / |
| X |
| / \ |
| / \ |
| / \ |
| / \|
|/ /|
|\ / |
Eu acho que isso era bastante óbvio, hein?
Desenhar esses diagramas à mão é bastante trabalhoso (confie em mim). Talvez algum código possa fazer isso por nós?
- Escreva algum código para emitir dois espelhos paralelos, com dois lasers que se cruzam e saltam.
- Entrada (todos os números inteiros):
- A largura do corredor
- O comprimento do corredor
- A posição inicial do laser correto (indexado a zero, deve ser menor que a largura)
- Posição inicial do laser esquerdo (indexado a zero, deve ser menor que a largura)
- Processo
- Se um laser estiver funcionando corretamente, ele será desenhado um espaço à direita na linha a seguir.
- Se um laser for deixado em movimento, ele será desenhado um espaço à esquerda na linha a seguir.
- Se um laser não puder dar um passo lateral, ele mudará de direção, mas não de posição.
- Se os dois laser estiverem no mesmo índice, imprima um X maiúsculo nesse índice.
- Resultado
- Uma sequência com várias linhas
- Cada linha começa e termina com um caractere de barra vertical (|)
- O laser à direita é indicado por uma barra invertida (\)
- O laser esquerdo é indicado por uma barra (/)
- A interseção de dois lasers é denotada por um X maiúsculo.
- Qualquer língua
- Eu gostaria de ver os links do TIO
- Tentativa de corrigi-lo no menor número de bytes
Casos de teste
largura: 6 comprimento: 10 à direita: 1 à esquerda: 4
| \ / |
| \/ |
| /\ |
| / \ |
|/ \|
|\ /|
| \ / |
| \/ |
| /\ |
| / \ |
largura: 6 comprimento: 10 à direita: 0 à esquerda: 1
|\/ |
|/\ |
|\ \ |
| \ \ |
| \ \ |
| \ \|
| \/|
| /\|
| / /|
| / / |
largura: 4 comprimento: 10 à direita: 2 à esquerda: 0
|/ \ |
|\ \|
| \ /|
| X |
| / \|
|/ /|
|\ / |
| X |
|/ \ |
|\ \|
largura: 20 comprimento: 5 à direita: 5 à esquerda: 15
| \ / |
| \ / |
| \ / |
| \ / |
| \ / |
largura: 5 comprimento: 6 à direita: 2 à esquerda: 2
| X |
| / \ |
|/ \|
|\ /|
| \ / |
| X |
largura: 1 comprimento: 2 à direita: 0 à esquerda: 0
|X|
|X|
Respostas:
Stax , 40 bytes
Execute e depure
Experimente online!
Certamente isso pode ser ainda mais jogado.
A entrada é fornecida na forma de
width [right-going left-going] length
(por comentário de @EngineerToast).Equivalente ASCII:
fonte
width [right-going left-going] length
JavaScript (ES6), 149 bytes
Recebe entrada na sintaxe de currying
(w)(h)([a,b])
.Experimente online!
Comentado
fonte
Python 2 , 119 bytes
Experimente online!
fonte
\\/
para\/
? Mesmo que a barra invertida seja interpretada duas vezes, ainda não escapará da barra.Python 2 , 168 bytes
Experimente online!
fonte
d
!Python 2 ,
187181179177174172171 bytesExperimente online!
Recursivo:
Python 2 , 172 bytes
Experimente online!
Impressão alternativa recursiva:
Python 2 , 172 bytes
Experimente online!
fonte
C (clang) ,
240236208 bytesExperimente online!
f () assume os parâmetros da seguinte maneira:
x
= largura,y
= comprimento,r
= posição inicial da linha inicial direital
= posição inicial da linha esquerda inicial-4 bytes. créditos Kevin Cruijssen. obrigado
fonte
while
para afor
para remover o{}
e um ponto e vírgula. E mais 1 byte, alterandoc&&d
parac&d
. Experimente online 236 bytes .Tela ,
6640 bytesExperimente aqui!
fonte
Carvão ,
5650 bytesExperimente online! Link é a versão detalhada do código. Editar: salvou 6 bytes, reduzindo a dependência de rotação. Explicação:
Imprima os lados.
Faça um loop sobre os dois lasers.
Mover para o início do laser.
Laço sobre a altura.
Desenhe a
\
ou/
na direção apropriada, a menos que o quadrado não esteja vazio; nesse caso, desenhe aX
.Atingimos um lado?
Nesse caso, dê um passo para o lado e inverta a direção da viagem.
fonte
Java (JDK 10) , 186 bytes
Experimente online!
fonte
PHP,
177 169166 bytesrequer PHP 7.1 para índices de string negativos, PHP 5.5 ou posterior para indexar literais de string.
para PHP <7.1 , remova
^L
, substitua"X\/"
por"/X\\"
,:0
com+1:1
,[$e]
com[$e+1]
, remova."|"
e insira|
antes da nova linha. (+3 bytes)para PHP <5.5 , substitua
"/X\\"
por$p
e insira$p="/X\\";
no início. (+2 bytes)recebe entrada dos argumentos da linha de comando. Corra com
-nr
ou experimente-os online .fonte
Python 3 , 162 bytes
Experimente online!
fonte
Ruby , 117 bytes
Experimente online!
Lambda anônima tendo entrada como largura
w
, alturah
e uma matriz de pontos de partidaa
.fonte
PowerShell ,
243233222205 bytesExperimente online!
Oooof. esses blocos lógicos são grandes e sujos e quase sempre duplicados. O próximo passo seria reescrevê-los para que eles não precisem da declaração else.
fonte
Python 2,
165164 bytesGuardou um byte graças a Jonathan Frech.
Experimente online!
fonte
\\/
é equivalente a\/
.K (ngn / k) , 58 bytes
Experimente online!
função anônima que aceita três argumentos:
x
a largura,y
o comprimento,z
um par de posições iniciais para os lasersfonte
C (gcc) , 169 bytes
Experimente online!
fonte
Kotlin ,
322311302 bytesMudou como eu coloquei a direção do laser na string por 11 bytes. Atribuição removida de quando por 9 bytes.
Experimente online!
fonte