Às vezes, quando estou rabiscando, desenho um retângulo, começo com uma diagonal de um dos cantos e, em seguida, trace uma linha "refletindo" toda vez que bato em um lado do retângulo. Eu continuo com isso até atingir outro canto do retângulo (e espero que a proporção do meu retângulo não seja irracional;)). É como traçar o caminho de um laser que brilha dentro de uma caixa. Você deve produzir o resultado disso com a arte ASCII.
Como exemplo, considere uma caixa de largura 5
e altura 3
. Sempre começaremos no canto superior esquerdo. Os #
marca o limite da caixa. Observe que a largura e a altura se referem às dimensões internas.
####### ####### ####### ####### ####### ####### #######
#\ # #\ # #\ \# #\ /\# #\ /\# #\/ /\# #\/\/\#
# \ # # \ /# # \ /# # \/ /# # \/ /# #/\/ /# #/\/\/#
# \ # # \/ # # \/ # # /\/ # #\/\/ # #\/\/ # #\/\/\#
####### ####### ####### ####### ####### ####### #######
O desafio
Dada a largura (positiva) e a altura da caixa, você deve produzir o resultado final da localização do laser. Você pode escrever um programa ou função, recebendo entradas via STDIN (ou alternativa mais próxima), argumento de linha de comando, argumento de função e gerar o resultado via STDOUT (ou alternativa mais próxima) ou através de valores ou argumentos de retorno de função.
Você pode usar qualquer formato conveniente de lista, sequência ou número para entrada. A saída deve ser uma única string (a menos que você a imprima em STDOUT, o que você pode fazer gradualmente). Isso também significa que você pode obter a altura primeiro e a largura segundo - basta especificar o formato exato de entrada na sua resposta.
Não deve haver espaços em branco à esquerda nem à direita em nenhuma linha da saída. Opcionalmente, você pode gerar uma única nova linha à direita.
Você deve usar o espaço, /
, \
e #
e reproduzir os casos de teste exatamente como mostrado.
Casos de teste
2 2
####
#\ #
# \#
####
3 2
#####
#\/\#
#/\/#
#####
6 3
########
#\ /#
# \ / #
# \/ #
########
7 1
#########
#\/\/\/\#
#########
1 3
###
#\#
#/#
#\#
###
7 5
#########
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#########
22 6
########################
#\ /\ /\ /\ /\ /\ #
# \/ \/ \/ \/ \/ \#
# /\ /\ /\ /\ /\ /#
#/ \/ \/ \/ \/ \/ #
#\ /\ /\ /\ /\ /\ #
# \/ \/ \/ \/ \/ \#
########################
X
seriam necessários para cruzamentos. Talvez na próxima vez. ;)Respostas:
Pitão,
434139 bytesExperimente online: Pyth Compiler / Executor . Insira os números na seguinte ordem: altura primeira linha, largura segunda linha.
Obrigado a isaacg, que ajudou a salvar dois bytes.
Explicação:
Minha solução não rastreia o laser, ele usa um padrão simples que inclui o gcd. Se
m, n
são as dimensões da caixa, deixed = gcd(m, n)
. O tamanho do padrão é exatamente2*d x 2*d
.Por exemplo, o padrão de repetição para
7 5
é
(
gcd(7, 5) = 1
, tamanho do padrão é2 x 2
)E o padrão de repetição para
22 6
é
(
gcd(22, 6) = 2
, tamanho do padrão é4 x 4
)Minha solução faz o seguinte para cada uma das linhas: ele simplesmente gera uma linha do padrão, repete-a algumas vezes e corta no final para que caiba na caixa.
fonte
X
suportes "atribuir" para cordas, você pode mudarm\
para*d
e removers
.*\
vez de emm\
breve, mas descarte-o porque tem o mesmo tamanho. Não pensou na variáveld
e no desnecessários
.C, 256 bytes
Provavelmente, posso obter isso abaixo de 200, e adicionarei uma explicação mais tarde, mas talvez eu deva ter um documento dentro de algumas horas.
fonte
J, 85 bytes
Let
g = gcd(w,h)
. A função preenche os elementos de umaw/g by h/g
matriz comg by g
ladrilhos, possuindo/
's\
' e 's na diagonal e anti-diagonal. A matriz 4D resultante é dividida em 2D (a parte interna da caixa) e depois é cercada por#
's. (Os números0 1 2 3
são usados em vez de[space] / \ #
e os números são alterados para caracteres no final.)Um cálculo baseado em posição direta da coordenada interna pode gerar uma solução um pouco mais curta.
Uso:
Experimente online aqui.
fonte
Calculadora Desmos - Não competindo para ajudar a conhecer mais
Experimente online!
Entradas:
Intermediários:
Formula, abreviada:
Saídas:
Como funciona:
O programa não atende ao critério final - gerando arte ASCII de caixa e linhas, por isso estou enviando informações não competitivas 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