задача
Напишите программу, чтобы определить, звучит ли нота, а также сколько центов расстроено, строки, настроенной на заданную частоту и нажатой в данной точке.
Для простоты предположим, что частота создаваемого звука и длина струны справа от места, где она нажата, обратно пропорциональны.
Примечание: эта задача имеет дело только с основным тоном, а не с обертонами / другими гармониками.
вход
Ваша программа получает две части данных:
Строка произвольной длины, представляющая рассматриваемую строку. Эта строка будет помечена знаком X, где она должна удерживаться.
[-----] is a string divided in six sections (five divisions). [--X--] is a string pressed at the exact center of the string. [X----] is a string pressed at 1/6 the length of the string. (Length used is 5/6) [-X--] is a string pressed at 2/5 of the length of the string. (Length used is 3/5)
Предположим, что нота звучит с использованием части строки справа от
X
.- Число (не обязательно целое число), обозначающее частоту настройки строки. Точность этого числа будет не более четырех цифр после запятой.
Можно предположить, что пройденные частоты будут лежать между 10 Hz
и 40000 Hz
.
Ввод может быть передан в формате по вашему выбору. Пожалуйста, укажите, как вход принят в вашу программу в вашем ответе.
Вывод
Ваша программа должна выводить как самую близкую ноту * в системе настройки равного темперамента из двенадцати тонов, так и количество центов от ближайшей ноты, которой будет обозначен звук, обозначенный строкой (округленный до ближайшего цента).
+n
центы следует использовать для обозначения n
центов, острых / выше примечания, и -n
центов для плоских / ниже примечания.
Примечание должно быть выведено в примечании научной подачи. Предположим, А4 настроен на 440Hz
. Используйте b и # для плоских / острых нот. Примечание: можно использовать либо острый, либо плоский. Для заметки в 466.16Hz
, A#
или Bb
может быть выведен для заметки.
Формат вывода зависит от вас, если вывод содержит только две ранее указанные части информации (то есть печать каждого возможного вывода не допускается).
* самая близкая нота относится к ноте, наиболее близкой к звуку, обозначаемому входом, измеренному в количестве центов (следовательно, ноте, которая находится внутри 50 cents
звука). Если звук отсутствует 50 cents
в двух разных нотах (после округления), то может быть выведена любая из двух нот.
Примеры
Ваша программа должна работать для всех случаев, а не только для следующих примеров.
Output Input Frequency Input String
A4, +0 cents 220 [-----X-----]
A5, +0 cents 220 [--------X--]
D5, -2 cents 440 [--X--------]
B4, -49 cents 440 [X----------]
A#4, +19 cents* 314.1592 [X-]
Eb9, +8 cents* 400 [-----------------------X]
Eb11,+8 cents* 100 [--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------X]
D#1, +49 cents* 10 [--X]
A0, -11 cents 11.7103 [---X--]
* Резкий или плоский может быть выведен.
Потенциально полезные ссылки
Это Код-гольф так самый короткий ответ выигрывает.
[--X--]
строка нажимается в середине деления, гдеx
находится символ, в то время как последний[-X--]
будет следовать 3/8 (не 2/5), если следовать этой логике. Или я что-то не так понимаю?[-X--]
строка делится на 4 места (и, следовательно, на 5 частей), и нажимается во втором из этих делений. Таким образом, он нажимается на2/5
, а длина используется3/5
.-
основном представляет позицию подразделений, спасибо за объяснение!Ответы:
BBC Basic, 161 #
Оценка исключает комментарии. Пока не играл в гольф.
Вывод
Выполняется правильно во всех тестовых случаях, кроме двух длинных. Для
Eb9
него , кажется , есть одна черта отсутствует из теста: Есть 22-
и одинX
, который делит строку на 24 равных частей. Согласно моим ручным расчетам, это 9600 Гц, что на 37 центов выше D9. Это именно то, что выводит моя программа. Если я добавлю еще одну черту, я получу Eb9 + 8 центов. К сожалению, BBC Basic не может обрабатывать строки длиной более 255 символов, поэтомуEb11
регистр выдает ошибку.источник
С 179
Получает изображение ascii на отдельной строке, а частоту на отдельной строке.
Несколько персонажей можно сбросить, уменьшив точность магических чисел
17.3123
и57.376
.Без игры в гольф программа выглядит так:
источник
scanf
строку формата. Я понятия не имел, что ты можешь сделать это. Я проверю ваш выходной код позже (я думал о том, чтобы сделать это в C, и хотя что-то подобное произошло со мной для вывода, я не мог найти способ сделать все это конкурентно.) Я предполагаюd+9
, потому что вы проиндексированы на примечание A, поэтому вы должны настроить октаву на индекс на примечании C: интересно, есть ли способ обойти это.JavaScript (199)
Назовите это, например, как
t('[X-]',314.1592)
Исправлена. (Так как я живу в Европе, я использовал B вместо Bb и H вместо B =)
источник
t('[---X--]',11.7103)
-10
-11
p="C0C#0D0D#0E0F0F#0G0G#0A0B0H".split(0)
экономит вам дополнительно 2 символа.round(x) = x+.5|0
которая корректна только для положительных чисел, я исправлю это позже. @ipi спасибо!Питон 3: 175
Ungolfed:
источник