З огляду на два назви нот, ви повинні написати програму, яка визначає, чи інтервал, утворений цими двома нотами, є співзвучним чи дисонансним.
Вступ
У західній музиці є лише 12 "різних" тонів. Їх імена, відсортовані від нижчого до вищого, є наступні: C, C#, D, D#, E, F, F#, G, G#, A, A#, B
. Послідовність є циклічною, тобто вона продовжується іншою C
після B
, нескінченно.
Відстань між двома тонами називається інтервалом . Інтервал між будь-якими двома нотами, які суміжні у ряді вище (наприклад, C — C#
або E — F
), називається півтоном . Інтервал між більш віддаленими нотами визначається як кількість півтонових кроків, необхідних для проходження від першого до другого (при цьому, можливо, обертання навколо послідовності). Деякі приклади: D to E
= 2 семітона, C to G
= 7 семітонів, B to D#
= 4 семітона (це обертається навколо послідовності). 1
Тепер ці інтервали поділяються на дві категорії: приголосні (приємно звучать, якщо відтворити дві ноти одразу) та дисонансні (не так багато).
Давайте визначимо приголосні інтервали, які мають бути: 0, 3, 4, 5, 7, 8 і 9 півтонів.
Решта з них є дисонансними, а саме: 1, 2, 6, 10 та 11 півтонів.
Змагання
Напишіть "програму" (у звичайному широкому сенсі цього слова: функція цілком нормальна), щоб зробити наступне:
Візьміть два імена примітки (рядки з послідовності, наведеної вище) як вхід. Ви можете приймати їх як завгодно (від stdin, як аргументи, розділені на все, що завгодно, навіть сміливо приймати їх як список символів (наприклад
["C","#"]
). Однак ви не можете призначати нотатки будь-які інші імена (особливо ви не може нумерувати їх від 0 до 11 і використовувати числа).Для вас музичні вигуки там, ноти будуть вказані без октави. У цьому випадку також не має значення, в якому порядку надходять ноти, а який нижчий і який вище. Нарешті, вам не потрібно обробляти будь-які імена, які не вказані у списку вище. Ніяких інших енхармоній, як
E#
, ні квартир, подвійних переробок тощо.Виберіть будь-які два різних значення. Ваша програма повинна виводити одну з них, коли інтервал, утворений двома нотами на вході, є співзвучним, а інший, якщо вони відсутні. (Може бути
True
іFalse
, але навіть π і e, якщо ви хочете :))Це код-гольф. Виграє найкоротша програма в байтах на кожній мові. Веселіться!
Приклади та тестові випадки
Note 1 Note 2 Output Interval [semitones]
C D Dissonant 2
A# A# Consonant 0
G D Consonant 7 (wraparound)
D# A Dissonant 6
F E Dissonant 11
A C Consonant 3
Я більше не додаю їх, оскільки в цьому немає жодних особливо підступних випадків.
Це мій перший виклик, тому будь-яка конструктивна критика щиро вітається :—). Якщо ви вважаєте, що пояснення теорії неохайне, не соромтеся задавати питання. Нарешті, будь ласка , не кажіть мені , що це боян з цього або цього . Я переконався, що це не так. (Останній досить схожий, але складніший. Я думав, що поставити трохи простіший виклик полегшить людям приєднання.)
1 : Я намагався спростити це пояснення, наскільки я міг. Існує набагато більше теорії про інтервали. Будь ласка, не лайте мене за те, що я його не випустив.