Se você pegar uma folha de papel milimetrado e desenhar uma linha inclinada que vai para a m
direita e para n
cima, você cruza linhas de grade n-1
horizontais e m-1
verticais em alguma sequência. Escreva o código para produzir essa sequência.
Por exemplo, m=5
e n=3
fornece:
Possivelmente relacionado: Gerando ritmos euclidianos , inclinações de Fibonacci , FizzBuzz
Entrada: Dois números inteiros positivos m,n
relativamente primos
Saída: retorne ou imprima os cruzamentos como uma sequência de dois tokens distintos. Por exemplo, poderia ser uma sequência de H
e V
, uma lista de True
e False
, ou 0
's e 1
' impressos em linhas separadas. Pode haver um separador entre tokens, desde que seja sempre o mesmo, e não, digamos, um número variável de espaços.
Casos de teste:
O primeiro caso de teste fornece saída vazia ou nenhuma saída.
1 1
1 2 H
2 1 V
1 3 HH
3 2 VHV
3 5 HVHHVH
5 3 VHVVHV
10 3 VVVHVVVHVVV
4 11 HHVHHHVHHHVHH
19 17 VHVHVHVHVHVHVHVHVVHVHVHVHVHVHVHVHV
39 100 HHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHH
No formato (m,n,output_as_list_of_0s_and_1s)
:
(1, 1, [])
(1, 2, [0])
(2, 1, [1])
(1, 3, [0, 0])
(3, 2, [1, 0, 1])
(3, 5, [0, 1, 0, 0, 1, 0])
(5, 3, [1, 0, 1, 1, 0, 1])
(10, 3, [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1])
(4, 11, [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0])
(19, 17, [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
(39, 100, [0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0])
Respostas:
Ruby, 92; Avestruz 0.7.0 , 38
A saída para ambos usa 1 e 0 (ex.
101101
).Aqui está uma explicação do avestruz:
E uma explicação de como tudo funciona, usando o código Ruby como guia:
fonte
Python, 53
Isso usa a saída da lista Verdadeiro / Falso. Nada de especial aqui.
fonte
Pitão -
3224 bytesRecebe entrada via stdin com o formato
[m,n]
. Imprime o resultado em stdout como uma lista de 0 e 1, em que 0 = V e 1 = H.Teste on-line
Explicação:
fonte
eM
é o mesmo quemed
.@"VH"
já que tem permissão para imprimir0
e1
nãoV
eH
.J
. Aqui está o que eu tenho até agora em 25 bytes: pyth.herokuapp.com/…jk
como a saída pode ser uma lista.Código de máquina IA-32, 26 bytes
Hexdump do código:
Comecei a partir do seguinte código C:
Ele grava a saída no buffer fornecido. Ele não retorna o comprimento da saída, mas não é realmente necessário: o comprimento da saída é sempre
m + n - 2
:Para converter o código C em código de máquina, primeiro fiz alguns ajustes, para tornar um dos
if/else
ramos vazio e comparar com0
em vez den
:A partir daqui, escrever o código de montagem em linha é direto:
fonte
t
está a "distância parabuzz
". Se a distância for pelo menosn
, váfizz
, então vábuzz
; atualize a distância; repita até que sejaPython - 125 bytes
Utiliza um algoritmo muito simples, apenas incrementa as coordenadas e detecta quando cruza as linhas e imprime. Estou procurando traduzir para Pyth.
Esse loop while está verificando o número de
l
ines e, em seguida, verificando se algum dos valores ultrapassou um limite int subtraindo.Toma entradas como
39, 100
stdin e imprime comoHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHH
stdout em uma linha.fonte
CJam, 15 bytes
Experimente aqui.
Imprime
01
para V e10
para H.Explicação
A linha diagonal cruza uma linha horizontal para cada 1 / n de toda a linha diagonal e cruza uma linha vertical para cada 1 / m.
fonte
TI-BASIC, 32
Direto. Usa uma sequência de
0
e1
, separada por quebras de linha. As vantagens do TI-BASIC são agcd(
multiplicação implícita e de dois bytes , mas suas desvantagens são o loop For, incluindo o valor final e os 5 bytes gastos na entrada.fonte
Python, 47
Como o algoritmo de anatolyg , mas verificado diretamente com os módulos.
fonte
Haskell, 78 bytes
Exemplo de uso:
Como funciona: faça uma lista dos valores x de todos os cruzamentos verticais
(x,0)
parax
em [1,2, ..., m-1] (0
indica vertical) e anexe a lista dos valores x de todos os cruzamentos horizontais(y*m/n,1)
paray
em [1,2, ..., n-1] (1
indica horizontal). Classifique e pegue os segundos elementos dos pares.Maldição do dia: novamente eu tenho que gastar 17 bytes no
import
porquesort
está dentroData.List
e não na biblioteca padrão.fonte
KDB (Q), 44 bytes
Explicação
Encontre tudo x valores do eixo dos pontos de interseção e ordene-os. Se o mod 1 for zero, seu "V", diferente de zero, será "H".
Teste
fonte
CJam,
2624 bytesExperimente online
Muito simples, praticamente uma implementação direta de um algoritmo do tipo Bresenham.
Explicação:
O último
01
precisa ser exibido porque o loop foi até o ponto final, o que não faz parte do resultado desejado. Note que podemos não basta reduzir a contagem de loop 1. Caso contrário, paraN > M
, todos os0
s da última iteração vai estar ausente, enquanto nós só precisa se livrar do último0
.fonte
>
para;W<
.1
no topo da pilha, posso usá-lo produtivamente.