Предыстория [что не соответствует действительности]
Фортепиано настроено так:
Однако на моем пианино все черные клавиши сломаны!
Я все еще хочу иметь возможность сыграть несколько аккордов на своем сломанном пианино.
В музыке аккорд - это группа нот, которые играются вместе. Чтобы учесть ввод аккордов, я сначала определю, что такое полутон.
Что такое полутон?
Полутон - самое маленькое расстояние в западной музыке. Если вы посмотрите на верхнюю часть пианино, вы увидите, что обычно вы можете перейти от черной клавиши к белой или наоборот; однако между B
и C
и E
и F
нет черного ключа.
Что такое аккорд?
Для целей этой задачи мы определяем аккорд как набор нот с определенным количеством полутонов между ними. Например, давайте возьмем 4-3-3
аккорд, начиная с аккорда C
(для музыкальных людей это аккорд V 7 фа мажор). Мы начинаем с C
. Мы рассчитываем на 4 полутона: C#
, D
, D#
, E
. Следующее замечание E
, и мы рассчитываем 3 полутона вверх после этого: F
, F#
, G
. Следующее замечание G
, и мы рассчитываем 3 полутона вверх после этого: G#
, A
, Bb
. Итак, мы получаем C-E-G-Bb
. Ура! Но подождите ... Bb
это черный ключ, и они сломаны ... Однако, если мы начнем G
, мы получим G-B-D-F
! Ура!
вход
Входные данные даны как список целых чисел в любом разумном формате. Это представляет аккорд, как описано выше.
Вывод
Вывод должен быть списком заметок, по которым я могу начать использовать только белые клавиши. Это также может быть просто строка из всех до 7 заметок, потому что все имена ключей будут одним символом. Вы должны быть в состоянии справиться и с пустым выводом.
Тестовые случаи
input -> output // comments
4 3 -> C F G // this is a major triad
3 4 -> D E A // this is a minor triad
4 3 3 -> G // this is the major-minor seventh chord
3 3 3 -> [empty output] // this is the diminished-diminished seventh chord. All of them use black keys
4 4 -> [empty output] // this is an augmented triad
3 3 -> B // this is a diminished triad
1 -> B E // this is just a minor second
11 -> C F // this is just a major seventh
Другие характеристики
- Стандартные лазейки запрещены
- Вы можете предположить, что на входе есть хотя бы одно целое число
- Вы можете предположить, что все целые числа неотрицательны и меньше 12 (потому что фортепиано повторяет каждые 12 нот)
- Вывод может быть в любом порядке
Критерии победы
Самое короткое действительное представление по состоянию на 15 апреля будет принято.
Ответы:
Желе , 25 байт
Попробуйте онлайн! или посмотрите набор тестов
Как?
источник
MATL , 31 байт
Спасибо Джонатану Аллану за исправление.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Шаблон
2 2 1 2 2 2 1
определяет интервалы между последовательными белыми клавишами. Программа использует цикл, который применяет все циклические сдвиги к этому базовому шаблону, чтобы проверить каждую клавишу как потенциальную нижнюю ноту входного аккорда. Для каждого сдвига получается совокупная сумма шаблона. Например, дляB
потенциальной нижней ноты шаблон был смещен,1 2 2 1 2 2 2
а его кумулятивная сумма равна1 3 5 6 8 10 12
.Теперь, чтобы увидеть , если это может поддержать
4 3 3
аккорд вычислит совокупную сумму интервалов аккордов, которая4 7 10
; уменьшить его с помощью 1 по модулю 12 (интервал14
даст2
); и проверьте, все ли числа являются членами допустимых значений1 3 5 6 8 10 12
. Это не тот случай в этом примере. Если бы это было так, мы бы вывели письмоB
.Соответствие между циклическими сдвигами и выходными буквами определяется строкой
'BAGFEDC'
. Это указывает на то, что'B'
(первый символ) соответствует циклическому сдвигу на1
;'A'
(второй символ) соответствует циклическому сдвигу и2
т. д.источник
Mathematica, 110 байт (кодировка ISO 8859-1)
Определяет унарную функцию,
±
принимающую список целых чисел в качестве входных данных (фактически, без ограничений на размер или знаки целых чисел) и возвращает список односимвольных строк. Например,±{3,4}
возвращает{"A","D","E"}
."A#BC#D#EF#G#"~StringTake~{Mod[#,12,1]}&/@#
это функция, которая превращает список целых чисел в соответствующие имена заметок, за исключением того, что#
обозначает любой черный ключ. Это применяется к каждому элементуAccumulate[i~Prepend~#]&/@Range@12
, который формирует список значений примечаний из списка ввода списка интервалов примечаний, начиная с каждой возможной примечания от 1 до 12. Мы отфильтровываем все такие списки имен примечаний, которые содержат"#"
использованиеSelect[...,FreeQ@"#"]
, а затем вернуть первое примечание в каждом оставшемся списке, используя#&@@@
.источник
+/-
символа.Accumulate[i~Prepend~#]&
потому что иначе было бы столкновение карри. Не стесняйтесь найти обходной путь, хотя!Python 2,
159155 байт(Публикация этого после проверки того, что есть действительное представление, которое короче этого)
Почти тривиальное решение. Входные данные в виде списка целых чисел и выходных данных с каждым символом в отдельной строке.
-4 байта, удалив ненужную переменную
источник
JavaScript (ES6),
727168 байтПроходит по каждой клавише, пропуская черные клавиши, а затем проверяет, что кумулятивная сумма полутонов никогда не попадает на черную клавишу.
Изменить: Сохранено 3 байта благодаря @Arnauld.
источник