Jestem muzykiem i potrzebuję więcej rytmów w moim życiu!
Polirytm występuje w muzyce (i w naturze), gdy dwa zdarzenia (klaszcze, nuty, migające świetliki itp.) Występują w dwóch różnych regularnych odstępach czasu. Te dwa zdarzenia zdarzają się różną liczbę razy w tym samym przedziale czasowym.
Jeśli stuknę lewą ręką dwa razy, a prawą 3 razy w tym samym czasie, wygląda to trochę tak:
------
R . . .
L . .
Łączniki u góry oznaczają długość wzoru wielotermicznego, który jest najniższą wspólną wielokrotnością lub 2 i 3. Można to rozumieć jako punkt, w którym wzór się powtarza.
Istnieje również „rytm”, który jest wzorem generowanym, gdy któraś ręka stuka:
------
R . . .
L . .
M . ...
Jest to prosty i bardzo popularny polirytm o stosunku 3: 2.
Powiedzmy, że nie chcę robić prostego polirytmu, który mogę wypracować w mojej głowie, więc potrzebuję czegoś, aby to dla mnie wypracować. Mógłbym to zrobić w formie długiej na papierze lub ...
Zasady:
- Napisz kod, aby wygenerować i wyświetlić diagram polirytmii, jak opisano powyżej.
- Dowolny stary język, spróbuj uzyskać jak najmniej bajtów.
- Twój kod przyjmuje dwa argumenty:
- Liczba uderzeń lewą ręką (dodatnia liczba całkowita)
- Liczba uderzeń prawą ręką (dodatnia liczba całkowita)
- Wyliczy długość, która jest najniższą wspólną wielokrotnością dwóch argumentów.
- Górny wiersz będzie się składał z dwóch białych znaków, a następnie łączników wyświetlających długość (długość * '-')
- Druga i trzecia linia pokażą wzór dla prawej i lewej ręki:
- Zacznie się od R lub L, zaznacz, która to ręka, a następnie spację.
- Interwał dla tej ręki jest długością podzieloną przez argument.
- Krany zaczną się od trzeciego znaku, oznaczonego dowolną wybraną postacią. Od tego momentu wyświetla te same znaki „odstęp” między znakami.
- Nie będzie dłuższy niż linia długości.
- Czwarta linia to rytm:
- Rozpocznie się od dużej litery M, po której nastąpi spacja.
- Od trzeciej postaci będzie ona wyświetlała postać (dowolną wybraną przez ciebie postać) na każdej pozycji, w której dotknie się prawej lub lewej ręki.
- Końcowe białe znaki nie mają znaczenia.
Przypadki testowe:
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 ........
Miłej gry w golfa!
r
il
jako dwie odrębne wartości? Czy możemy na przykład zaakceptować tablicę dwuelementową? A co z ich kolejnością, czy jest to ściśler
przestrzeganel
?Odpowiedzi:
JavaScript (ES6), 131 bajtów
Wyprowadza
0
jako znak kranu .Wypróbuj online!
W jaki sposób?
Używamy tej samej funkcji pomocniczej do dwóch różnych celów.sol( )
Kiedy jest wywoływane bez argumentu lub argumentu równego 0 , rekurencyjnie buduje ciąg łącznika o długości k = lcm ( l , r ) z końcowym przesuwem linii:sol( ) 0 k = lcm( l , r )
Ten ciąg jest zapisywany w .s
źródło
Java 11,
226234233219 bajtówDługo; szkoda, że Java nie ma
lcm()
funkcji. Wypróbuj online tutaj (TIO nie ma jeszcze Java 11, więc zamiast tego używa metody pomocniczejString.repeat()
).Moja początkowa wersja zajęła przerwę między dotknięciami zamiast liczby uderzeń. Naprawiono teraz. Dzięki Kevin Cruijssen za grę w golfa 1 bajt.
Nie golfowany:
źródło
?".":" "
na?'.':32
.Python 2 ,
187185183174166156148147145 bajtówUżywa
-
jako znaku kranuWypróbuj online!
Zapisano:
źródło
[i%(w/y)and i%(w/z)>0]
może być[i%(w/y)!=0<i%(w/z)]
.Perl 6 ,
858078 bajtów-2 bajty dzięki Jo King.
Wypróbuj online!
Zwraca listę czterech linii.
źródło
Python 2 ,
185 228 223 234249 bajtówWypróbuj online!
źródło
r=4, l=8
działa dla mnie dobrze15,25
. daje375
, ale powinno być75
.i%r+i%l+0**i<1
. Możesz także usunąć poprzednie wersje kodu, ponieważ zostaną one zachowane w historii edycji każdego, kto chce je zobaczyćGalaretka , 32 bajty
Wypróbuj online!
Pobiera dane wejściowe jako listę
[L,R]
.źródło
C (gcc), 204 bajty
Port mojej odpowiedzi Java . Zadzwoń z
f(number_of_right_hand_taps, number_of_left_hand_taps)
. Wypróbuj online tutaj .źródło
Pyth, 53 bajty
Zdecydowanie miejsce na golfa. Zrobię to, gdy będę miał czas.
Wypróbuj tutaj
Wyjaśnienie
źródło
C # (interaktywny kompilator Visual C #) , 254 bajty
Gra w golfa Wypróbuj online!
Bez golfa
Pełny kod
Prasowe
254 bytes
- Wstępne rozwiązanie.Notatki
źródło
Węgiel , 52 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Oblicz LCM danych wejściowych, biorąc pierwszą wielokrotność tego
R
, przez którą można podzielićL
.Wydrukuj LCM, który automatycznie wyświetli wymagany wiersz
-
s. Następnie przejdź do drukowania rytmu od prawej do lewej.Zapętlaj liczby od LCM do 0 i utwórz tablicę list reprezentujących uderzenia prawej i lewej ręki.
Pętlę nad uderzeniami i dodaj rytm.
Wydrukuj odwrócone uderzenia w dół, ale ponieważ jest to tablica, kończą się w lewo.
Wydrukuj nagłówek.
źródło
Rubin ,
130126 bajtówWypróbuj online!
źródło
Python 2 , 117 bajtów
Wypróbuj online!
źródło
Pyth, 49 bajtów
Oczekuje danych wejściowych w formularzu
[r,l]
. Używa-
do wyświetlania kranów. Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .źródło
R ,
161149146 bajtówWypróbuj online!
Zdecydowanie czuję, że jest tu miejsce na poprawę, ale wypróbowałem kilka różnych podejść i tylko to utknęło.
Pozbycie się definicji funkcji wewnętrznej sprawi, że będę całkiem szczęśliwy, i spróbowałem zrobić kilka zmian struktury cat (), aby tak się stało.Nieważne, jak tylko opublikowałem, zdałem sobie sprawę, co mogę zrobić. Nadal zdecydowanie można znaleźć oszczędności wydajności.Istnieją inne funkcje LCM w bibliotekach o krótszych nazwach, ale TIO ma liczby i uważam, że w tym momencie jest to bardziej wartościowe.
źródło
C ++ (gcc) , 197 bajtów
Wypróbuj online!
źródło
++p%a+p%b
zamiast++p%a||p%b