Sou músico e preciso de mais polirritmos na minha vida!
Um polirritmo ocorre na música (e na natureza) quando dois eventos (palmas, notas, vaga-lumes piscando etc.) ocorrem em dois intervalos regulares diferentes. Os dois tipos de evento acontecem um número diferente de vezes no mesmo intervalo.
Se eu tocar com a mão esquerda duas vezes e com a mão direita três vezes, no mesmo espaço de tempo, ficará um pouco assim:
------
R . . .
L . .
Os hífens no topo denotam o comprimento do padrão polirrmico, que é o menor múltiplo comum ou 2 e 3. Isso pode ser entendido como o ponto em que o padrão se repete.
Há também um 'metarritmo', que é o padrão produzido quando uma das mãos está tocando:
------
R . . .
L . .
M . ...
Este é um polirritmo simples e muito comum, com uma proporção de 3: 2.
Digamos apenas que não quero fazer um polirritmo simples que possa resolver na minha cabeça, então preciso de algo para resolver isso para mim. Eu poderia fazer isso de forma longa no papel, ou ...
Regras:
- Escreva algum código para gerar e exibir um diagrama polirritmático, conforme descrito acima.
- Qualquer idioma antigo, tente pelo menor número de bytes.
- Seu código usa dois argumentos:
- Número de toques com a mão esquerda (número inteiro positivo)
- Número de toques com a mão direita (número inteiro positivo)
- Ele calculará o comprimento, que é o múltiplo comum mais baixo para os dois argumentos.
- A linha superior será composta por dois caracteres de espaço em branco seguidos por hífens exibindo o comprimento (comprimento * '-')
- A segunda e terceira linhas mostrarão o padrão para as mãos direita e esquerda:
- Ele começará com um R ou L, indique de que lado ele é, seguido por um espaço.
- O intervalo para essa mão é o comprimento dividido por seu argumento.
- Os toques começarão no terceiro caractere, indicado por qualquer caractere que você escolher. A partir de então, ele exibirá o mesmo caractere 'intervalo' caracteres separados.
- Não será maior que a linha de comprimento.
- A quarta linha é o metarritmo:
- Ele começará com M maiúsculo, seguido por um espaço.
- A partir do terceiro caractere, ele mostrará um personagem (qualquer personagem que você escolher) em todas as posições em que houver um toque na mão direita ou esquerda.
- O espaço em branco à direita é irrelevante.
Casos de teste:
r = 3, l = 2
------
R . . .
L . .
M . ...
r = 4, l = 3
------------
R . . . .
L . . .
M . .. . ..
r = 4, l = 5
--------------------
R . . . .
L . . . . .
M . .. . . . ..
r = 4, l = 7
----------------------------
R . . . .
L . . . . . . .
M . . .. . . . .. .
r = 4, l = 8
--------
R . . . .
L ........
M ........
Feliz golfe!
r
el
como dois valores separados? Poderíamos aceitar uma matriz de dois elementos, por exemplo? Que tal a ordem deles, isso ér
seguido estritamentel
?Respostas:
JavaScript (ES6), 131 bytes
Saídas
0
como o caractere de toque .Experimente online!
Quão?
fonte
Java 11,
226234233219 bytesTipo de longo; muito ruim Java não tem uma
lcm()
função. Experimente online aqui (o TIO ainda não possui o Java 11, portanto, ele usa um método auxiliar em vez deString.repeat()
).Minha versão inicial levou o intervalo entre toques em vez do número de toques. Corrigido agora. Agradecimentos a Kevin Cruijssen pelo golfe de 1 byte.
Ungolfed:
fonte
?".":" "
para?'.':32
.Python 2 ,
187185183174166156148147145 bytesUsa
-
como caractere de toqueExperimente online!
Salvou:
fonte
[i%(w/y)and i%(w/z)>0]
poderia ser[i%(w/y)!=0<i%(w/z)]
.Perl 6 ,
858078 bytes-2 bytes graças a Jo King.
Experimente online!
Retorna uma lista de quatro linhas.
fonte
Python 2 ,
185 228 223 234249 bytesExperimente online!
fonte
r=4, l=8
funciona bem para mim15,25
, para , dá375
, mas deveria ser75
.i%r+i%l+0**i<1
. Além disso, você pode remover versões anteriores do código, como eles serão preservados em seu histórico de edição de alguém quiser vê-losGelatina , 32 bytes
Experimente online!
Leva a entrada como uma lista
[L,R]
.fonte
C (gcc), 204 bytes
Porta da minha resposta Java . Ligue com
f(number_of_right_hand_taps, number_of_left_hand_taps)
. Experimente online aqui .fonte
Pitão, 53 bytes
Definitivamente espaço para golfe. Farei isso quando tiver tempo.
Experimente aqui
Explicação
fonte
C # (compilador interativo do Visual C #) , 254 bytes
Golfe Experimente online!
Ungolfed
Código completo
Lançamentos
254 bytes
- Solução inicial.Notas
fonte
Carvão , 52 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Calcule o LCM das entradas, tomando o primeiro múltiplo do
R
que é divisível porL
.Imprima o LCM, que gera automaticamente a linha necessária de
-
s. Em seguida, mova para imprimir o ritmo da direita para a esquerda.Faça um loop sobre os números do LCM até 0 e crie uma matriz de listas representando as batidas das mãos direita e esquerda.
Faça um loop sobre as batidas e adicione o metarritmo.
Imprima as batidas invertidas para baixo, mas como essa é uma matriz, elas terminam para a esquerda.
Imprima o cabeçalho.
fonte
Ruby ,
130126 bytesExperimente online!
fonte
Python 2 , 117 bytes
Experimente online!
fonte
Pitão, 49 bytes
Espera entrada no formulário
[r,l]
. Usa-
para exibir toques. Experimente on-line aqui ou verifique todos os casos de teste de uma vez aqui .fonte
R ,
161149146 bytesExperimente online!
Definitivamente, sinto que há espaço para melhorias aqui, mas tentei algumas abordagens diferentes e essa é a única que ficou presa.
Livrar-me da definição da função interna me deixaria muito feliz e tentei várias reestruturações do cat () para que isso acontecesse.Deixa pra lá, assim que postei, percebi o que podia fazer. Definitivamente, ainda existem algumas economias de eficiência.Existem outras funções LCM em bibliotecas com nomes mais curtos, mas o TIO possui números e eu considero isso mais valioso neste momento.
fonte
C ++ (gcc) , 197 bytes
Experimente online!
fonte
++p%a+p%b
vez de++p%a||p%b