Учитывая два названия нот, вы должны написать программу, которая определяет, является ли интервал, образованный этими двумя нотами, согласным или диссонантным.
Введение
В западной музыке есть только 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 : я попытался упростить это объяснение, насколько я мог. Есть намного больше теории относительно интервалов. Пожалуйста, не ругайте меня за то, что я оставил это.