Методические рекомендации
задача
Учитывая две ноты, введенные в виде строк или списков / массивов, вычислите, сколько между ними полутонов (включая сами ноты), и выведите их в виде числа.
Объяснение полутона:
Полутон - это один шаг вверх или вниз по клавиатуре. Примером является C на C #. Как вы можете видеть ниже, нота C находится на белой ноте, а C # - черная нота, только одна над ней. Полутона - это скачки от черной ноты к следующей белой ноте, вверх или вниз, за исключением:
- От B до C
- С на Б
- От E до F
- От F до E
Примеры
'A, C' -> 4
'G, G#' -> 2
'F#, B' -> 6
'Bb, Bb' -> 13
правила
- Наибольшее расстояние между двумя нотами составляет 13 полутонов.
- Вторая введенная заметка всегда будет выше первой введенной заметки.
- Вы можете принимать входные данные либо как строку, либо как массив / список. Если вы возьмете его за строку, заметки будут разделены запятыми (например
String -> 'A, F'
,Array -> ['A', 'F']
). - Вы можете предположить, что вам всегда будут предоставлены две действительные заметки.
- Шарпы будут обозначаться как,
#
а квартиры будут обозначаться какb
- Ваш код должен поддерживать энгармонические эквиваленты (например, он должен поддерживать как F #, так и Gb)
- Ваш код не должен поддерживать заметки, которые названы с помощью, но могут быть названы без резких или плоских (т.е. вам не нужно поддерживать E # или Cb). Бонусные баллы, если ваш код поддерживает это все же.
- Ваш код не должен поддерживать двойные острые или двойные квартиры.
- Вы можете предположить, что если вы получаете одинаковые ноты или одинаковую высоту звука (например, «Gb, Gb» или «A #, Bb»), вторая не будет точно на одну октаву выше первой.
- Это код гольф, поэтому ответ с наименьшим количеством байтов выигрывает.
G -> G#
потому что они оба включены.Cb
илиE#
? А как насчет двойных острых предметов / квартир?(X, Y]
так, что C к C # - 1 полутон, и C к C - 12 полутонов.Ответы:
Python 2 , 66 байт
Попробуйте онлайн!
Python 2 , 68 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 78 байт
Сохранено 1 байт благодаря @Neil
Делает заметки в карри синтаксиса
(a)(b)
.Контрольные примеры
Показать фрагмент кода
Хэш-функция
Цель хэш-функции - преобразовать заметку в указатель в таблице поиска, содержащей смещения полутонов (C = 0, C # = 1, ..., B = 11), хранящиеся в шестнадцатеричном формате.
Сначала мы присоединять «3» на ноту и анализировать полученную строку в базе-36, что приводит к целому числу N . Поскольку «#» является недопустимым символом, он просто игнорируется вместе с любым последующим символом.
Затем мы вычисляем:
Ниже приведена сводка результатов.
О квартирах и острых предметах
Ниже приведено доказательство того, что эта хеш-функция гарантирует, что примечание, за которым следует «#», дает тот же результат, что и следующее примечание, за которым следует «b» . В этом параграфе мы используем префикс @ для базовых 36 величин.
Например, Db будет преобразован в @ db3, а C # будет преобразован в @c (см. Предыдущий абзац). Мы хотим доказать, что:
Или в общем случае с Y = X + 1 :
@ b3 - 399 в десятичном виде. Следовательно:
1296 соответствует 1 по модулю 37 , так что это можно упростить как:
Особый случай - переход от G # к Ab , поскольку мы ожидаем, что Hb соответствует приведенным выше формулам. Тем не менее, этот также работает, потому что:
источник
Perl,
3932 байтаВключает
+1
в себя дляp
Дайте начальную и конечную заметки в виде двух строк на STDIN
Просто код:
источник
Japt , 27 байт
Проверьте это онлайн! Принимает ввод как массив из двух строк.
Также работает для любого количества острых предметов или квартир на любой базовой ноте!
объяснение
источник
Perl 5+
-p
, 66 байтПопробуйте онлайн!
Принимает значения через запятую. Также работает для Cb, B #, E #, Fb и нескольких # / b.
Объяснение:
Объяснение для Eval:
источник
Рубин , 56 байт
Попробуйте онлайн!
Буквы анализируются в соответствии с их временами кодирования ASCII
5/3
следующим образом (это дает требуемое количество полутонов плюс смещение 108)Последний символ (
#
,b
или снова буква) анализируется как его ASCII - код , деленное на 32 следующим образомЭто вычитается из буквенного кода.
Тогда окончательный результат возвращается как
13-(difference in semitones)%12
источник
Stax ,
2524 байтаЗапустите и отладьте его онлайн
Соответствующее представление ascii той же программы таково.
По сути, он вычисляет индекс клавиатуры каждой ноты, используя формулу, а затем вычисляет результирующий интервал.
2 - code / 32
гдеcode
есть код ASCII последнего символа.источник
["F#","B"]
должно быть 6.Пакет,
136135 байтовОбъяснение: замены в
c
подпрограмме заменить#
в имени заметки на+1
иb
с-1
. Поскольку это без учета регистра,Bb
становится-1-1
. Поэтому переменные дляC
...A
(также не чувствительные к регистру) выбираются так, чтобы они соответствовали количеству полутонов отB=-1
. Результирующая строка затем оценивается, и уловка @ xnor вычитания результата из значения дает желаемый эффект вычитания значений нот друг от друга. Изменить: Наконец, я использую трюк @ Арно, вычитая по модулю из 13, чтобы получить желаемый ответ, сохраняя 1 байт.источник
Python 3 , 95 байт
Попробуйте онлайн!
-14 байт благодаря user71546
источник
ord(q[0])-65
заменой"ABCDEFG".find(q[0])
;)(g(b)+~g(a))%12+2
заменой1+((g(b)-g(a))%12or 12)
Желе , 28 байт
Монадическая ссылка, принимающая список из двух списков символов и возвращающая целое число.
Попробуйте онлайн! или посмотрите все возможные случаи .
Как?
Выполняет некоторую причудливую арифметику для ординалов входных символов, чтобы сопоставить ноты с целыми числами от нуля до двенадцати, а затем выполняет базовую декомпрессию как прокси для модуля по двенадцати, где ноль затем заменяется на 12, а затем добавляет один.
Также на 28 байтов ...
(Не очень прямой) порт ответа xnor Python 2 ...
Попробуйте все возможные случаи
источник
CJam , 67 байт
Онлайн переводчик: http://cjam.aditsu.net/
источник