Я музыкант, и мне нужно больше полиритмов в моей жизни!
Полиритм возникает в музыке (и в природе), когда два события (хлопки, ноты, мигание светлячков и т. Д.) Происходят с двумя разными регулярными интервалами. Два вида событий происходят разное количество раз в одном и том же интервале.
Если я коснусь левой рукой два раза и правой рукой три раза за одно и то же время, это будет выглядеть примерно так:
------
R . . .
L . .
Дефисы в верхней части обозначают длину полиртмического шаблона, который является наименьшим общим кратным или 2 и 3. Это можно понимать как точку, в которой шаблон повторяется.
Есть также «метаритм», который представляет собой паттерн, генерируемый при нажатии любой руки:
------
R . . .
L . .
M . ...
Это простой и очень распространенный полиритм с соотношением 3: 2.
Скажем так, я не хочу делать простой полиритм, который я могу выработать в своей голове, поэтому мне нужно что-то, чтобы решить это для меня. Я мог бы сделать это на бумаге, или ...
Правила:
- Напишите некоторый код для генерации и отображения диаграммы ритма, как описано выше.
- Любой старый язык, попробуйте наименьшее количество байтов.
- Ваш код принимает два аргумента:
- Количество нажатий левой рукой (положительное целое число)
- Количество нажатий правой рукой (положительное целое число)
- Он определит длину, которая является наименьшим общим кратным для двух аргументов.
- Верхняя строка будет состоять из двух пробельных символов, за которыми следуют дефисы, отображающие длину (длина * '-')
- Вторая и третья строки покажут образец для правой и левой руки:
- Он начнется с R или L, обозначьте, какая это рука, а затем пробел.
- Интервал для этой руки - это длина, разделенная на аргумент.
- Нажатие начнется с третьего символа, обозначенного любым выбранным вами символом. С этого момента он будет отображать один и тот же символ с интервалом.
- Это не будет длиннее, чем длина линии.
- Четвертая строка - это метаритм:
- Он начнется с заглавной буквы M, за которой следует пробел.
- Начиная с третьего символа, он будет отображать символ (любой выбранный вами символ) в каждой позиции, где есть нажатие на правую или левую руку.
- Конечный пробел не имеет значения.
Тестовые случаи:
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 ........
Удачного игры в гольф!
r
иl
как два отдельных значения? Можем ли мы принять массив из двух элементов, например? Как насчет их порядка, это строгоr
соблюдаетсяl
?Ответы:
JavaScript (ES6), 131 байт
Выводится
0
как символ касания .Попробуйте онлайн!
Как?
Мы используем одну и ту же вспомогательную функцию для двух разных целей.грамм( )
источник
Java 11,
226234233219 байтВид длинного; Жаль, что Java не имеет
lcm()
функции. Попробуйте онлайн здесь (у TIO пока нет Java 11, поэтому вместо него используется вспомогательный методString.repeat()
).Моя первоначальная версия взяла интервал между нажатиями вместо количества нажатий. Исправлено сейчас. Спасибо Кевину Круйссену за игру в гольф 1 байт.
Ungolfed:
источник
?".":" "
на?'.':32
.Python 2 ,
187185183174166156148147145 байтовИспользуется
-
как символ нажатияПопробуйте онлайн!
Добавлено:
источник
[i%(w/y)and i%(w/z)>0]
может быть[i%(w/y)!=0<i%(w/z)]
.Perl 6 ,
858078 байт-2 байта благодаря Джо Кингу.
Попробуйте онлайн!
Возвращает список из четырех строк.
источник
Python 2 ,
185 228 223 234249 байтПопробуйте онлайн!
источник
r=4, l=8
у меня отлично работает15,25
, это дает375
, но это должно быть75
.i%r+i%l+0**i<1
. Кроме того, вы можете удалить предыдущие версии кода, так как они будут сохранены в вашей истории редактирования, если кто-то захочет их увидетьЖеле , 32 байта
Попробуйте онлайн!
Принимает ввод в виде списка
[L,R]
.источник
C (gcc), 204 байта
Порт моего Java ответа . Позвони с
f(number_of_right_hand_taps, number_of_left_hand_taps)
. Попробуйте это онлайн здесь .источник
Pyth, 53 байта
Определенно место для гольфа. Сделаю так, когда у меня будет время.
Попробуй здесь
объяснение
источник
C # (интерактивный компилятор Visual C #) , 254 байта
Гольф Попробуйте онлайн!
Ungolfed
Полный код
релизы
254 bytes
- Исходное решение.Примечания
источник
Древесный уголь , 52 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Рассчитайте LCM входных данных, взяв первое кратное,
R
которое делится наL
.Выведите LCM, который автоматически выведет необходимую строку
-
s. Затем двигайтесь, чтобы напечатать ритм справа налево.Цикл по номерам от LCM до 0 и создать массив списков, представляющих удары правой и левой руки.
Зацикливайтесь на ритмах и добавляйте метаритм.
Напечатайте обратные доли вниз, но поскольку это массив, они заканчиваются влево.
Распечатать заголовок.
источник
Рубин ,
130126 байтовПопробуйте онлайн!
источник
Python 2 , 117 байт
Попробуйте онлайн!
источник
Pyth, 49 байтов
Ожидает ввода в форме
[r,l]
. Используется-
для отображения кранов. Попробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .источник
R ,
161149146 байтПопробуйте онлайн!
Я определенно чувствую, что здесь есть возможности для улучшения, но я попробовал несколько разных подходов, и это единственный, который застрял.
Избавление от определения внутренней функции сделало бы меня очень счастливым, и я попытался сделать несколько изменений структуры cat (), чтобы это произошло.Не берите в голову, как только я отправил, я понял, что я мог сделать. По-прежнему определенно можно найти некоторую экономию эффективности.В библиотеках с более короткими именами есть другие функции LCM, но у TIO есть числа, и я посчитал это более ценным на данный момент.
источник
C ++ (gcc) , 197 байт
Попробуйте онлайн!
источник
++p%a+p%b
вместо++p%a||p%b