Завдання
Напишіть програму, щоб визначити, як звучить нота разом із тим, скільки копійок виходить із мелодії, струни, налаштованої на задану частоту та натиснутої в заданій точці.
Для простоти припустимо, що частота видаваного звуку та довжина струни праворуч від місця її натискання обернено пропорційні.
Зауважте: це завдання стосується виключно основного тону, а не обертонів / інших гармонік.
Вхідні дані
Вашій програмі надаються два фрагменти даних:
Рядок довільної довжини, що представляє відповідну рядок. Цей рядок буде позначений символом 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
центів для квартири / нижче банкноти.
Примітка повинна виводитись у науковому позначенні тону. Припустимо, що A4 налаштований на 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--]
рядок ділиться на 4 місця (і, отже, на 5 частин), і натискається на другому з цих відділів. Таким чином, він притискається до 2/5
, і використовувана довжина 3/5
.
-
основному представляє позицію підрозділів, дякую за пояснення!
[--X--]
рядок натискається в середині підрозділу, деx
розміщений знак, а останній[-X--]
буде при 3/8 (а не 2/5) при дотриманні цієї логіки. Або я розумію щось не так?