Быстрая музыкальная переподготовка:
Клавиатура фортепиано состоит из 88 нот. На каждую октаву есть 12 нот, C, C♯/D♭, D, D♯/E♭, E, F, F♯/G♭, G, G♯/A♭, A, A♯/B♭
и B
. Каждый раз, когда вы нажимаете «C», паттерн повторяется на октаву выше.
Нота однозначно идентифицируется 1) буквой, включая любые острые или плоские элементы, и 2) октавой, которая является числом от 0 до 8. Первые три ноты клавиатуры, A0, A♯/B♭
и B0
. После этого наступает полная хроматическая шкала на октаву 1. C1, C♯1/D♭1, D1, D♯1/E♭1, E1, F1, F♯1/G♭1, G1, G♯1/A♭1, A1, A♯1/B♭1
а B1
. После этого идет полная хроматическая шкала на октавы 2, 3, 4, 5, 6 и 7. Затем последняя нота - это C8
.
Каждая нота соответствует частоте в диапазоне 20–4100 Гц. С A0
началом ровно 27.500 герц, каждая из которых соответствует нота предыдущих времен примечания двенадцатого корень из двух, или примерно 1.059463. Более общая формула:
где n - номер банкноты, где A0 равно 1. (Более подробная информация здесь )
Соревнование
Напишите программу или функцию, которая принимает строку, представляющую заметку, и печатает или возвращает частоту этой заметки. Мы будем использовать знак фунта #
для острого символа (или хэштегом для вас, юношей) и строчную букву b
для плоского символа. Все входные данные будут выглядеть (uppercase letter) + (optional sharp or flat) + (number)
без пробелов. Если ввод находится за пределами диапазона клавиатуры (ниже, чем A0, или выше, чем C8), или имеются недопустимые, пропущенные или лишние символы, это недопустимый ввод, и вам не нужно обрабатывать его. Вы также можете с уверенностью предположить, что вы не получите никаких странных вводов, таких как E # или Cb.
точность
Поскольку бесконечная точность на самом деле невозможна, мы скажем, что все, что находится в пределах одного цента от истинного значения, является приемлемым. Не вдаваясь в лишние детали, цент - это 1200-й корень из двух, или 1.0005777895. Давайте использовать конкретный пример, чтобы сделать его более понятным. Допустим, ваш вклад был А4. Точное значение этого следует отметить 440 Гц. Однажды центовая квартира 440 / 1.0005777895 = 439.7459
. 440 * 1.0005777895 = 440.2542
Следовательно, если резкость цента , любое число, большее 439,7459, но меньшее 440,2542, является достаточно точным для подсчета.
Контрольные примеры
A0 --> 27.500
C4 --> 261.626
F#3 --> 184.997
Bb6 --> 1864.66
A#6 --> 1864.66
A4 --> 440
D9 --> Too high, invalid input.
G0 --> Too low, invalid input.
Fb5 --> Invalid input.
E --> Missing octave, invalid input
b2 --> Lowercase, invalid input
H#4 --> H is not a real note, invalid input.
Имейте в виду, что вам не нужно обрабатывать неверные данные. Если ваша программа делает вид, что они являются реальными входными данными, и выводит значение, которое является приемлемым. Если ваша программа падает, то это также приемлемо. Все, что может случиться, когда вы получаете один. Полный список входов и выходов см. На этой странице
Как обычно, это код-гольф, поэтому применяются стандартные лазейки, и выигрывает кратчайший ответ в байтах.
H
?H
значение B - AFAIK, используется только в немецкоязычных странах. (гдеB
, кстати, означает Bb.) То, что британцы и ирландцы называют B, называется Si или Ti в Испании и Италии, как в Do Re Mi Fa Sol La Si.H
используется в Германии, Чехии, Словакии, Польше, Венгрии, Сербии, Дании, Норвегии, Финляндии, Эстонии и Австрии, согласно Википедии . (Я также могу подтвердить это для Финляндии.)Ответы:
Japt,
41373534 байтаУ меня наконец-то появился шанс найти
¾
хорошее применение! :-)Попробуйте онлайн!
Как это устроено
Контрольные примеры
Все действительные тестовые случаи проходят через хорошо. Это недействительные, где это становится странным ...
источник
Pyth,
464443423935 байтПопробуйте онлайн. Тестирование.
Код теперь использует алгоритм, аналогичный ответу Japt от ETHproductions , так что за это ему заслужили благодарность.
объяснение
Старая версия (42 байта, 39 с упакованной строкой)
объяснение
Показать фрагмент кода
источник
Mathematica, 77 байтов
Пояснение :
Основная идея этой функции - преобразовать строку примечания в ее относительную высоту, а затем вычислить ее частоту.
Я использую метод экспорта звука в MIDI и импорта необработанных данных, но я подозреваю, что есть более элегантный способ.
Тестовые случаи :
источник
MATL ,
56535049 48 байтовИспользует текущий выпуск (10.1.0) , который является более ранним, чем этот вызов.
Попробуйте онлайн !
объяснение
источник
JavaScript ES7,
737069 байтИспользует ту же технику, что и мой ответ Япта .
источник
Руби,
6965Неуправляемый в тестовой программе
Выход
источник
ES7, 82 байта
Возвращает 130.8127826502993 на входе «B # 2», как и ожидалось.
Редактировать: 3 байта сохранены благодаря @ user81655.
источник
2*3**3*2
- 108 в консоли браузера Firefox, что соответствует2*(3**3)*2
. Также обратите внимание, что на этой странице также указано, что она?:
имеет более высокий приоритет, чем,=
но на самом деле они имеют одинаковый приоритет (рассмотримa=b?c=d:e=f
).**
поэтому я никогда не смог проверить его. Я думаю,?:
что имеет более высокий приоритет, чем,=
хотя, потому что в вашем примереa
задан результат троичного, а неb
выполнение троичного. Два других задания заключены в троицу, поэтому они представляют собой особый случай.e=f
внутри троичного?a=b?c=d:e=f?g:h
. Если бы они имели одинаковый приоритет и первый троичный конец заканчивался=
послеe
, это привело бы к недопустимой ошибке левого присваивания.?:
имело более высокий приоритет, чем в=
любом случае. Выражение нужно сгруппировать так, как если бы оно былоa=(b?c=d:(e=(f?g:h)))
. Вы не можете сделать это, если они не имеют одинакового приоритета.C, 123 байта
Использование:
Расчетное значение всегда примерно на 0,8 цента меньше, чем точное значение, потому что я вырезал как можно больше цифр из чисел с плавающей запятой.
Обзор кода:
источник
R
157150141136 байтС отступом и переводом строки:
Использование:
источник
Python,
9795 байтОснованный на старом подходе Pietu1998 (и других) поиска индекса примечания в строке
'C@D@EF@G@A@B'
для некоторого пустого символа или другого. Я использую итеративную распаковку для разбора строки заметки без условий. В конце я сделал немного алгебры, чтобы упростить выражение преобразования. Не знаю, смогу ли я сделать это короче без изменения моего подхода.источник
b==['#']
может быть сокращен до'#'in b
, иnot b
вb>[]
.Wolfram Language (Mathematica), 69 байт
Использование музыкального пакета , с помощью которого простой ввод заметки в качестве выражения оценивает его частоту, например:
Для того, чтобы сохранить байты, избегая импортировать пакет с
<<Music
, я использую полные имена:Music`Eflat3
. Тем не менее, я все еще должен заменитьb
наflat
и#
с,sharp
чтобы соответствовать формату ввода вопроса, который я делаю с простымStringReplace
.источник