Гриф гитары выглядит так:
0 1 2 3 4 5 6 7 8 9 10 11 12 <- Fret number (0 means it's open)
|-E--F--F#-G--G#-A--A#-B--C--C#-D--D#-E
|-B--C--C#-D--D#-E--F--F#-G--G#-A--A#-B
|-G--G#-A--A#-B--C--C#-D--D#-E--F--F#-G
|-D--D#-E--F--F#-G--G#-A--A#-B--C--C#-D
|-A--A#-B--C--C#-D--D#-E--F--F#-G--G#-A
|-E--F--F#-G--G#-A--A#-B--C--C#-D--D#-E
Как видите, первая открытая строка (сверху) - это E
. Первый лад на первой струне - это F
. Четвертый лад на третьей струне - это B
. Обратите внимание, что первая нота - это ноль, а не первая.
Это можно записать цифрами в формате string, fret
. Строки пронумерованы от 1 до 6 сверху вниз. Лады нумеруются от 0 до 12 слева направо. Первый E
поэтому 1, 0
. Некоторые другие примеры:
1, 0 --> E
1, 1 --> F
3, 5 --> C
5, 1 --> A#
6, 6 --> A#
Вызов:
Возьмите N
пары чисел ( s
и f
) и выведите последовательность примечаний с разделителями.
- Ввод может быть в любом подходящем формате. кортежи, 2D-матрица, два отдельных списка, переплетенный список (строка, раздражение, строка, раздражение ...) и т. д.
- Выходной тон должен быть разделен, но разделитель необязателен (запятая, пробел, тире ...). Вывод может быть в верхнем или нижнем регистре.
s
(для строки) будет в диапазоне[1, 6]
(вы можете выбрать i 0-indexed)f
(для раздражения) будет в диапазоне[0, 12]
Тестовые случаи и примеры:
1 4 5 2 1 3 <- String
4 2 6 3 5 1 <- Fret
G# E D# D A G#
6 2 3 1 4 2 3 2 2 2 6 5 2
0 1 2 3 4 5 6 7 8 9 10 11 12
E C A G F# E C# F# G G# D G# B
3 3 3 3 3 3 3 3 3 3 3 3 3 <- String
0 3 5 0 3 6 5 0 3 5 3 0 0 <- Fret
G A# C G A# C# C G A# C A# G G
// The same test case, but different input and output format:
(3,0)(3,3)(3,5)(3,3)(3,6)(3,5)(3,0)(3,3)(3,5)(3,3)(3,0)(3,0)
G,A#,C,G,A#,C#,C,G,A#,C,A#,G,G
Удачи и счастливого гольфа!
Ответы:
05AB1E ,
48474340 байтИспользует кодировку CP-1252 .
И струны, и лады начинаются с 0.
объяснение
Попробуйте онлайн!
Сохранено 7 байтов благодаря Аднану
источник
"AA#BCC#DD#EFF#GG#"•7V3•3BS£
а"A A# B C C# D D# E F F# G G#"#
не на несколько байт короче :)."AA#BCC#DD#EFF#GG#"
строки:•™ÎÚ,Ülu•žh'#A«‡
(поскольку строчные буквы разрешены: p).JavaScript (ES6),
7970 байтТребуются строки на основе 1. Редактировать: Сохранение 9 байтов путем непосредственного вычисления преобразования строки в лад, основываясь на старом ответе @ nimi.
источник
Mathematica, 62 байта (не конкурирует)
Символы
{24,19,15,10,5,0}
the и theE2
представляют открытые струны шести гитарных струн (например, верхняя строка на 24 полутона выше ноты E2). Не конкурирует, потому что не печатает названия нот - он воспроизводит последовательность нот! (только если у вас есть Mathematica, к сожалению) Например,играет первые 4 такта или около того из канона Пахельбеля. (это примерно столько же Канона Пахельбеля, сколько я могу вынести)
источник
MATL ,
484745 байтСпасибо @Emigna за исправление относительно формата ввода.
Гитара и код гольф ... Я должен был ответить на этот вопрос!
Формат ввода: массив строки (на основе 1), затем массив ладов (на основе 0).
Попробуйте онлайн!
объяснение
Некоторые языковые функции, используемые в этом ответе:
Код комментария:
источник
Ява, 174
Ungolfed:
источник
C
104103 байтПринимает числа в виде
string fret
пар на стандартном вводе и выводит примечание после каждой пары. Например:источник
Рубин, 63 байта
принимает массив из 2-х элементов в порядке
[string,fret]
.объяснение
В стандартной настройке гитара является одним из немногих струнных инструментов (изогнутых или резных), у которых есть непостоянные интервалы между струнами. Большинство из них имеют либо согласованный 5-полутоновый интервал между всеми парами соседних строк («четвертая»), либо согласованный 7-полутоновый интервал между всеми парами соседних строк («пятая»). Они соответствуют частотным отношениям 3: 4. и 2: 3 соответственно, и уступают по значению только «октаве» с частотным соотношением 1: 2.
Гитара имеет в основном 5-полутоновые интервалы. Если бы он имел 5 из них, он имел бы разницу в 25 полутонов между 1-й и 6-й строками. Вместо этого интервал между 2-й и 3-й струнами уменьшается до 4 полутонов, что дает разницу в 24 полутона (2 октавы), что лучше для игры аккордов.
Это неудобно для программы, поэтому мы начнем с изменения 1-индексированной интонации гитары на 0-индексированную 5-струнную басовую интонацию, которая имеет все интервалы по 5 полутонов:
Затем мы добавляем 2 и задаем настройку фиктивного 12-струнного баса с интонацией открытых струн следующим образом, и все интервалы составляют 5 полутонов (12 басовых «басов» существуют, но я не уверен, что есть много именно с этим настройка.)
Как видно, все острые предметы сгруппированы вместе. Этот шаблон может повторяться до бесконечности. Он известен как «круг пятых» и является фундаментальным для западной музыкальной шкалы (с небольшой настройкой настройки круг можно замкнуть из-за того, что
(3/2)**12
и2**7
очень похожи числа.Теперь мы имеем дело с параметром ладу. В отличие от многих других ответов здесь, которые переводят строковый параметр в несколько раздражений, я преобразовываю параметр раздражения в ряд строк. В приведенной выше таблице видно, что добавление 7 к номеру строки приводит нас к строке, имя примечания которой на полутона выше. (Он находится в совершенно другой октаве, но это не имеет значения.) Итак, мы добавляем
i[1]*7
к номеру строки и принимаем его по модулю 12:Мы вычитаем это из 6, чтобы получить число в диапазоне от 6 до -5, и ищем букву в
BEADGCF
(Ruby позволяет оборачивать отрицательные индексы обратно в конец массива.) Еслиn>=7
нам нужно добавить#
символ для завершения вывода ,Тестовая программа
Выход
источник
C #, 131 байт
Введите два отдельных списка, строки 1 на основе.
источник
Клора , 55 байт
@T[0,7,2,10,5,0,7]+N%12@T[,A,A#,B,C#,D,D#,E,F,F#,G,G#]!
объяснение
@
числовой режим (чтение ввода в виде чисел)T[0,7,2,10,5,0,7]
Преобразование ввода с использованием массива, ex array [Input]+N
Добавить N (следующее значение ввода) к текущему входу%12
По модулю 12 текущее входное значение@
Выключить цифровой режимT[,A,A#,B,C#,D,D#,E,F,F#,G,G#]
Перевести ввод в массив!
Использовать ввод как выходное значениеисточник
Java 7
197163 байтаUngolfed
источник
Python 2,
94, 91, 88 байтовВероятно, есть некоторые очевидные улучшения, которые необходимо сделать. Ввод - это список пар, а строки с индексами 0, например:
источник
Haskell,
8382 байтаПринимает список строк и список раздражений, оба с 0 индексами. Пример использования:
Из бесконечного списка примечаний, начинающихся с
A#
, уберите количество примечаний, данных списком[6,1,9,4,11,6]
по индексу строки, и выберите примечание по индексу раздражения из оставшегося списка.источник
(s*7)+(s>2)
- так что теперь я использую это в своем ответе.JavaScript (ES6),
8281 байтЯ хотел попробовать математический ответ, но он получился немного длинным. Может быть, есть способ сыграть в гольф ...
Тестовый фрагмент
Показать фрагмент кода
источник
toString(17)
но изо всех сил пытался получить его в разумном количестве байтов.PHP, 102 байта
Ввод в виде множественного массива с 0, например, '[[2,0], [5,3], [2,12], [3,8], [0,3]]'
Хорошая альтернатива 106 байт для установки # на основе конгруэнта мода 7
источник