Основная шкала (или ионийская шкала) является одной из наиболее часто используемых музыкальных шкал, особенно в западной музыке. Это одна из диатонических шкал. Как и многие музыкальные гаммы, он состоит из семи нот: восьмая дублирует первую на удвоенной частоте, так что она называется высшей октавой той же ноты.
Семь музыкальных нот:
C, D, E, F, G, A, B , C (повторяется для примера)
Основная шкала - это диатоническая шкала. Возьмите предыдущую последовательность нот в качестве основной шкалы (на самом деле, это шкала до мажор) . Последовательность интервалов между нотами большой шкалы:
целое, целое, половина, целое, целое, целое, половина
где «целый» обозначает полный тон (красная U-образная кривая на рисунке), а «половина» обозначает полутон (красная пунктирная линия на рисунке).
В этом случае от C до D существует целый тон, от D до E существует целый тон, от E до F существует половина тон, и т.д. ...
У нас есть 2 компонента, которые влияют на тональное расстояние между нотами. Это острый символ (♯) и плоский символ (♭).
Острый символ (♯) добавляет полутона к ноте. Пример. От C до D мы упомянули, что существует целый тон, если мы используем C♯ вместо C, то от C♯ до D существует полутон.
Плоский символ (♭) противоположен острому символу, он вычитает полутон из ноты. Пример: от D до E мы упоминали, что существует целый тон, если мы используем Db вместо D, то от Db до E существует тон с половиной.
По умолчанию от Note до Note существует целый тон, кроме E to F
иB to C
в котором только половина тон существует.
Обратите внимание, что в некоторых случаях использование энгармонических тонов может создать эквивалент для Major Scale. Примером этого является C#, D#, E#, F#, G#, A#, B#, C#
где E#
и B#
являются энгармоническими, но шкала следует за последовательностью мажорной шкалы.
Вызов
Учитывая масштаб, выведите истинное значение, если оно является мажорным или эквивалентным, в противном случае выведите значение Фальси.
правила
- Стандартный метод ввода / вывода разрешен
- Применяются стандартные правила игры в гольф
- Вам не нужно принимать во внимание восьмую ноту. Предположим, что вход будет состоять только из 7 заметок
- Предположим, что двойного плоского (♭♭), двойного острого (♯♯) или натурального знака (♮) не существует
Контрольные примеры
C, D, E, F, G, A, B => true
C#, D#, E#, F#, G#, A#, B# => true
Db, Eb, F, Gb, Ab, Bb, C => true
D, E, Gb, G, A, Cb, C# => true
Eb, E#, G, G#, Bb, B#, D => true
-----------------------------------------------
C, D#, E, F, G, A, B => false
Db, Eb, F, Gb, Ab, B, C => false
G#, E, F, A, B, D#, C => false
C#, C#, E#, F#, G#, A#, B# => false
Eb, E#, Gb, G#, Bb, B#, D => false
источник
Ответы:
Perl 6 ,
76656359 байт-4 байта благодаря Филу Н
Попробуйте онлайн!
объяснение
источник
Node.js v10.9.0 ,
78767169 байтПопробуйте онлайн!
Как?
Каждая нотаn преобразуется в отрицательное число в [−118,−71] с помощью:
Который дает:
Мы вычисляем попарные разности по модулю12 между этими значениями.
Наименьшая возможная разница между 2 нотами−47 , поэтому достаточно добавить 4×12=48 перед применением по модулю, чтобы убедиться, что мы получаем положительный результат.
Поскольку мы применяем модуль12 , смещение, полученное с помощью a, 36mod12=0 полутонов, тогда как смещение, полученное с помощью a, 38mod12=2 полутона.
'#'
на самом деле составляет'b'
составляетисточник
JavaScript (Node.js) ,
150131125 байтПопробуйте онлайн!
-19 байт благодаря Луису Фелипе
-6 байт благодаря Шегги
Ungolfed:
источник
[...'C0D0EF0G0A0B']
вместо'C0D0EF0G0A0B'.split('')
и+""
вместо того,.toString()
чтобы сохранить некоторые байтыx[1]=='#'|-(x[1]=='b')
вместо того, чтобыx[1]=='#'?1:(x[1]=='b'?-1:0)
сохранить некоторые байты тоже-10 % 12 == 2
. Хотя если подумать, в некоторых случаях это может не сработать ...Дротик ,
198 197 196189 байтПопробуйте онлайн!
Свободный порт старого Perl 6 ответа /codegolf//a/175522/64722
Старая версия :
Дротик , 210 байт
Попробуйте онлайн!
Ungolfed:
Целый шаг - 2, четверть - 1. Мод 12, если вы прыгаете на более высокую октаву. Перебирает все заметки и вычисляет разницу между i-ой и i-ой нотой. Объединяет результат и должен ожидать 221222 (2 целых, 1 половина, 3 целых).
источник
i=1
наi=0
может уменьшить байт путем измененияfor(;i<7;i++)
наfor(;++i<7;)
. Кроме того, кронштейны{}
могут быть удалены вокруг этого цикла,, поместивj+=...
внутри третьей части цикла:for(;++i<7;j+='${(y[0]-y[1])%12}')
. И последнее, что меняется,return j=='221222';
чтобыreturn'221222'==j;
избавиться от пространства. -6 ( 210 байт ) после этих модификаций.if(k>9)k--;if(k>3)k--;
вk-=k>3?k>9?2:1:0;
иk+=m.length<2?0:m[1]=='#'?1:m[1]=='b'?-1:0;return k;
кreturn m.length<2?k:m[1]=='#'?k+1:m[1]=='b'?k-1:k;
. :)C (gcc) ,
-DA=a[i]
+ 183 = 191 байтПопробуйте онлайн!
На основании ответа Perl.
Принимает ввод в виде широкой строки.
Ungolfed:
источник
[Wolfram Language (Mathematica) + пакет Music`], 114 байт
Я люблю музыку и нашел это интересным, но я играл в настоящий гольф, когда появилась возможность играть в гольф с кодом, так что мое представление немного запоздало.
Я подумал, что попробую это совершенно по-другому, используя некоторые реальные музыкальные знания. Оказывается, музыкальный пакет Mathematica знает основную частоту названных нот. Сначала я преобразую входную строку в последовательность именованных заметок. Затем я беру отношения каждой последовательной ноты и удваиваю все, которые меньше 2 (для учета октавного сдвига). Затем я сравниваю эти соотношения с соотношениями ионной шкалы, которая имеет примерно 6% разности частот между половинными нотами и 12% между полными нотами.
Более половины байтов, потраченных здесь, предназначены для преобразования входных данных в именованные символы.
Попробуйте онлайн!
источник
Python 3 ,
175136134114112 байтПопробуйте онлайн!
Однострочная реализация Python 3.
Спасибо @Arnauld за идею расчета тонов с использованием деления и по модулю.
Спасибо @Jo King за -39 байтов.
источник
[Python]
269202 байтаУлучшения от
Jo King
:Попытайся!
Ungolfed, с тестовым водителем:
источник
Рубин , 109 байт
Попробуйте онлайн!
источник