Прежде чем уйти, вам не нужно разбираться в музыкальной нотации, чтобы выполнить этот вызов.
ОБЪЯСНЕНИЕ
В стандартных нотах двойные ключи переходят по странице, служа ориентирами к нотам, давая вам понять, какую ноту следует сыграть. Если вы еще не знакомы со скрипичным и басовым ключом, вот описание из Википедии:
Ключ - это музыкальный символ, используемый для обозначения высоты звука записанных нот. Помещенный в одну из строк в начале нотного стана, он указывает название и высоту нот в этой строке. Эта линия служит контрольной точкой, по которой могут быть определены имена нот на любой другой линии или в пространстве нотного стана.
На изображении выше верхняя половина строк - это скрипичный ключ, обозначенный
Нижняя половина - это басовый ключ, обозначенный
Как вы можете видеть на скрипичный ключ запиской на самой нижней строке является E . (Я не считая нот за пределами CLEF линий для этой задачи) На бас - ключах, самая низкая линия является G . Чтобы выполнить эту задачу, вы должны сделать следующее:
ВЫЗОВ
Учитывая вход в одной из следующих форм (ваш выбор), преобразовать его в противоположный ключ. Является ли это скрипичным или басовым ключом, может быть значением Truthey / Falsey в вашем языке (а не просто любыми двумя значениями), например
F # T или F # True или F # Treble
но нет
F # -1 или F # 4
Пробелы и заглавные буквы являются необязательными. Квартиры не отображаются, а завершающие пробелы запрещены.
Input Expected Output
E Treble G
F Treble A
F# Treble A#
G Treble B
G# Treble C
A Treble C
A# Treble C#
B Treble D
C Treble E
C# Treble F
D Treble F
D# Treble F#
E Treble G
F Treble A
F# Treble A#
G Bass E
G# Bass F
A Bass F
A# Bass F#
B Bass G
C Bass A
C# Bass A#
D Bass B
D# Bass C
E Bass C
F Bass D
F# Bass D#
G Bass E
G# Bass F
A Bass F
A# Bass F#
Будьте предупреждены, это не тривиальная задача постоянной разницы. Посмотрите внимательно на входы и выходы. Если вы посмотрите на пианино,
черные клавиши - острые, обозначенные #. Обратите внимание, что нет E # или B #. Это означает, что если вы получили G # на басовом ключе, вместо того, чтобы возвращать E # , вам нужно вернуть F
Это код-гольф , поэтому выигрывает самый маленький счетчик байтов.
источник
C
вместоC
) хорошо?1
и-1
(или даже сказать,4
и-4
) для ввода индикатора clef, или это будет приемлемо только в том случае, если в нашем языке это значения true / falsey?Ответы:
Желе ,
3534 байтаУ меня есть ощущение, что какая-то арифметика может победить этот метод.
Попробуйте онлайн!
Полная программа, состоящая из 1) индикатора ключа
0
или1
для низких или высоких частот соответственно и 2) ноты; и печать полученной заметки.Было бы 31 байт, если бы
-4
и4
были приемлемы в качестве входных значений индикатора clef (тогда ониÑi+_⁸?4ị¢
могут статьÑi+⁸ị¢
), но это было уточнено как недопустимое, если -4 не является ложным, а 4 является правдивым, что не относится к Jelly.Как?
Создает клавиатуру с фантомом
B#
иE#
клавишами, находит индекс ввода, смещает его4
в нужном направлении, индексирует обратно в клавиатуру, и эти фантомные клавиши заменяются требуемыми результатами (клавиша над ними):источник
Befunge,
7064 байтаПопробуйте онлайн!
Ввод должен быть в форме
C# Treble
илиF Bass
, хотя ключ может быть просто первой буквой (т. Е.T
ИлиB
), так как остальная часть ввода в любом случае игнорируется.объяснение
В результате этой модификации кода следующая последовательность инструкций примет одну из двух форм:
На этом этапе стек либо содержит,
note,0,sharp,space
либоnote,0,space
.На этом этапе стек либо содержит,
note,0
либо простоnote
(с неявным нулем ниже).источник
Perl 5, 56 байт
Читает заметку и ключ как две строки из STDIN и печатает новую заметку в STDOUT. Ключ
0
для высоких и1
низких частот.источник
-p
флаг tio.run/##K0gtyjH9/79YX08/OaNIwcxUW0PXRMvGTju/KEVFTVPVXD/…JavaScript (ES6) 74 байта
Принимает входной сигнал в выделки синтаксиса ,
(note)(clef)
гдеclef
есть0
для баса и1
для высоких частот .демонстрация
Показать фрагмент кода
Как?
На самом деле это немного менее забавно, чем в моей предыдущей версии, но базовая таблица поиска теперь
F#,C#,(unused),D#,A#,F,C,G,D,A,E,B,F
позволяет сократить условие # , избегая при этом трюка с символами NUL - который, я полагаю, был немного пограничным.Предыдущая версия
7675 байтдемонстрация
Показать фрагмент кода
Как?
Ввод (n, c) обрабатывается посредством следующих шагов:
Мы первые оценки ,
4 * !!n[1] + c + n
где!!n[1]
это верно (принуждаем к 1 ) , если ноте содержит # , и ЛОЖЬ (принуждение к 0 ) в противном случае. Выражение4 * !!n[1] + c
приводит к числовому значению, которое добавляется перед строкой n .Неявный шаг: начальные нули и конечный # игнорируются
parseInt()
. Например,"5G#"
фактически анализируется как"5G"
.Мы конвертируем новую строку в десятичное значение, анализируя ее как величину base-21.
Мы применяем по модулю 24.
Мы применяем по модулю 17.
Ниже приводится сводная таблица для всех возможных входных пар, а также ожидаемый результат. Обратите внимание, что # должен быть добавлен к выводу, если конечный результат 0 , 2 , 3 или 5 . Отсюда использование двоичной маски 101101 ( 45 в десятичной).
источник
Python 2 , 77 байт
Функция, которая печатает в
STDOUT
.True
преобразует низкие и высокие частоты, аFalse
высокие - в низкиеПопробуйте онлайн!
Объяснение:
N=ord(n[0])-63-4*c;
вычисляет индекс (от 0 до 7) буквы новой заметки, не обращая внимания на острые предметы.ord(N[0])-63-4*c
получает индекс текущей буквы и добавляет или вычитает 2 в зависимости от значенияc
(переменная для переключения направления преобразования)M=-~N%3<1<len(n);
вычисляет, нужно ли корректировать эту переменную. Например, если новая заметка естьE
, а исходная заметка имела резкую, это нужно будет скорректировать доF
. Цепное неравенство работает следующим образом:-~N%3<1
проверяет, находится ли индекс новой заметки в последовательности3n-1
. Это будет только выход верно дляE
иB
, две ноты , которые не имеют резкий.1<len(n)
проверяет, имел ли резкое примечание оригинал (это сделало бы длину строки больше чем 1). Это необходимо, поскольку, если не было резких, нет необходимости корректировать новые буквы заметки.M
либоTrue
либоFalse
, либо , что может использоваться в вычислениях как1
и0
соответственно, поэтому для выполнения корректировки нам нужно только добавить M к N и по модулю 7.chr((N+M)%7+65)
добавляет корректировку, если необходимо, затем преобразует значение из индекса обратно в символ.+n[1:2-M]
добавит резкий символ, если обаM=0
(без регулировки) и исходное значение также имели резкий.источник
Java 8, 119 байт
Объяснение:
Попробуй это здесь.
источник
n->b->((char)((n.charAt(0)-(b?0:4))%7+65)+n.substring(1)).replaceAll("B#","C").replaceAll("E#","F")
R 111 байтов
Попробуйте онлайн!
Ungolfed:
источник