Труба является клапанным аэрофоном инструмента, как правило , станом B♭
. Звук издается, когда игрок вибрирует губами, чтобы вытеснить воздух внутри инструмента. Эта вибрация приобретается путем установки рта определенным образом, называемым амбушюром. Различные амбушюры, с более плотными или более свободными губами, производят различные шаги.
Кроме того, каждый клапан в трубе также изменяет высоту тона инструмента. При нажатии клапан закрывает путь внутри трубки инструмента, заставляя воздух проходить через более длинный путь, тем самым снижая высоту исходного звука. Для целей этой задачи мы рассмотрим стандартную B♭
трубу, в которой первый клапан понижает высоту звука на полный шаг, второй понижает высоту звука на полшага, а третий понижает высоту звука на единицу и полшага
Соревнование
Ваша задача состоит в том, чтобы создать программу или функцию, которая с учетом двух входов embouchure
и valves
определяет высоту воспроизводимой ноты.
Для целей этого испытания примечания будут следовать последовательности:
B♭, B, C, C♯, D, E♭, E, F, F♯, G, G♯, A.
правила
- Ввод / вывод может быть взят / дан любым разумным способом .
- Применяются стандартные лазейки .
- Вы можете использовать
b
и#
вместо,♭
и♯
если вы хотите. - В качестве входных данных
valves
можно указать список нажатых клапанов (1, 3
) или логический список (1, 0, 1
). - Это код-гольф , поэтому выигрывает самый короткий код на каждом языке.
Тестовые случаи:
Valves
в этих тестовых случаях задается как логический список, где 0 означает нажатие, а 1 - нажатие.
Embouchure: Valves: Output:
B♭ 0 0 0 B♭
B♭ 0 1 0 A
B♭ 1 0 1 F
C♯ 0 0 1 B♭
C♯ 1 1 1 G
E♭ 1 0 0 C♯
G 0 1 1 E♭
G♯ 1 0 0 F♯
G♯ 0 0 1 F
G 1 0 0 F
F♯ 1 0 0 E
D 1 0 1 A
A 1 1 1 E♭
E 1 1 0 C♯
E 0 0 1 C♯
Отказ от ответственности: я еще не очень музыкант, поэтому я прошу прощения за любую бойню, которую я, возможно, сделал в тестовых случаях. Исправления приветствуются.
F# 100
быть E не F?C#
на трубе, не нажимая какие-либо клапаны. Просто конкретные заметки (B♭-F-B♭-D-F-A♭-B♭...
), обертоновые серииB♭
. Тем не менее, даже если он не отражает реальный инструмент, задача отлично определена.Ответы:
питон
32,12511981 байтПопробуйте онлайн!
Благодаря Джонатану Аллану сэкономлено много байтов.
Мое оригинальное решение (в Python 3 ):
Попробуйте онлайн!
Сохранено 6 байтов благодаря @HyperNeutrino.
объяснение
Во-первых, я делаю массив заметок, но их длина увеличивается вдвое, поэтому мне не нужно беспокоиться о циклическом переходе от
Bb
кA
.Затем я беру ввод в следующем формате (например):
Затем я нахожу индекс начальной заметки, используя
n.index(e,9)
(9
чтобы убедиться, что я начинаю хорошо в середине списка (удвоенного). Я вычисляю желаемое смещение с помощью выражения:Где
f
первый клапан,s
второй клапан иt
третий.Наконец, он просто печатает заметку, найденную в списке, вычитая смещение из начального индекса.
источник
"<some string>".split()
расщепляется поstr
иint
слепки и позволяя оцененный ввод) и реверсивных ноты и компенсируя вперед (избегая,9
вindex
. Вызове попробовать Интернет!'Bb', 1, 1, 1
вас к индексу,-6
который будетE
, как требуется) - это то, что имеет TFeld так как сделано .Wolfram Language (Mathematica) , 100 байт (и 134 для рабочей трубы)
Попробуйте онлайн!
Довольно просто.
Лучший выход для стоимости 34 байта.
источник
Желе ,
3736 байтДвоичная ссылка, принимающая клапаны в виде списка
1
s или0
s в виде списка, представленного[second, first, third]
слева, и амбушюры в виде списка символов справа, который возвращает список символов.Попробуйте онлайн!
Как?
источник
Рубин , 71 байт
Попробуйте онлайн!
70 символов, но 80 байтов
Попробуйте онлайн!
источник
Javascript 96 байт
Следуя идее @vasilescur, это реализация в js
источник
b
и#
разрешено), но нужно использоватьb
и#
вместо квартир и острых предметов.Пакет, 188 байт
Использует
#
иb
: это означает, чтоEb
иBb
являются допустимыми именами переменных;#
обрабатывается путем замены строки на+1
. Результат замены строки затем автоматически оценивается, и клапаны затем учитываются, прежде чем результат будет найден в списке.источник
Stax , 32 байта
Запустите и отладьте его онлайн
Требуется имя записки и список нажатых клапанов. Он создает массив имен заметок, затем вычисляет общий интервал между клапанами и получает примечание с этим смещением в массиве.
Запустите этот
источник
Python 2 ,
8479 байтПопробуйте онлайн!
источник
C (gcc) ,
92 8682 байтаПопробуйте онлайн!
Адаптировано из реализации @ Vazt .
источник
Perl6 / Rakudo 73 символа
Технически это 83 байта, потому что я вставил символы Unicode, но замена их на эквиваленты ASCII дала бы 73 байта.
Так как
{code block}
с такими параметрами$^a
это лямбда, с подписью($a, $b, $c, $d)
.Назови это:
Менее golfed:
Здесь мы удваиваем строку,
'...' x 2
используяx
инфиксный оператор, затем ищем вложение, за которым следуют n заметок, используя оператор smartmatch'...' ~~ /.../
- регулярное выражение зависит от\w\W?
слова char, а может быть от слова non char.Мы ищем n примеров этого через
(\w\W?)**{$_}
, где мы уже вычислили n =$_
от параметров$b
до$d
. Это приводит к совпадению из записки в амбушюре с полученной запиской, из которой мы просто хотим последнюю, поэтому сопоставляем ее с другой~~ /\w\W?$/
.Для расчета
$_
необходим первый$^b
создания неявного параметра в блоке.76 символов
Альтернатива, использующая массив, а не совпадения строк, - это еще 3 символа:
Нахождение амбушюра в списке достигается с помощью
@arr.first: $^a, :k
, который возвращает индекс (ключ) найденного элемента с помощью:k
.Установка массива
$_
(как объект) позволяет нам использовать.first
и.[ ]
на нем , не тратя слишком много символов.источник
C (gcc) , 155 байт
Попробуйте онлайн!
Простой подход
Вход клапана составляет 0,1.
Ввод Embouchure должен быть в нижнем регистре. Интересно, что TiO не находит
strcmpi()
без включенияstring.h
, тогда как mingw-gcc позволяет делать это со стандартным-Wimplicit-function-declaration
предупреждением.источник