вход
Символ любого триадического аккорда (см. Http://en.wikipedia.org/wiki/Chord_(music)#Triads ).
Выход
Ноты, составляющие данный аккорд.
Примеры
Вход: AM
Выход:A C# E
Вход: C#m
Выход:C# E G#
Вход: Db+
Выход:C# F A
Вход: C0
Выход:C D# F#
Бонусы
-50, если вы можете также иметь дело с седьмыми аккордами
-150 за то, что на самом деле играет звук аккорда
-150 за использование печатных символов, чтобы показать, как играть аккорд на фортепиано; пример для AM
:
┌─┬─┬┬─┬─┬─┬─┬┬─┲┱─┬─┬─┲━┱┬─┲━┱─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┲┛┗┱┘ │ ┗┯┛└┲┛ ┃ └┬┘└┬┘└┬┘ │
│ │ │ │ │ ┃ ┃ │ │ ┃ ┃ │ │ │ │
└──┴──┴──┴──┴──┺━━┹──┴──┴──┺━━┹──┴──┴──┴──┘
-100 за использование печатных символов, чтобы показать, как играть аккорд на гитаре; пример для AM
:
x o o o o o
┌───┬───┬───┬───┬───┐
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ █ █ █ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
(см. https://en.wikipedia.org/wiki/Box-drawing_character )
правила
Результатом должна быть программа или скрипт командной строки.
Вход и выход могут быть в любой форме, если они соответствуют стандарту музыкальной нотации.
Гитара или фортепьяно считается действительным, если и только если оно содержит три (триадные) или четыре (седьмой) обязательные ноты и ничего больше. Одна и та же нота может присутствовать несколько раз в аккорде.
Внешние библиотеки не допускаются, за исключением генерации звука (в этом случае директивы
#include
,import
... не добавляются к числу символов).Это код гольф, выигрывает самый короткий код!
Немного теории музыки ...
В современной западной тональной музыке каждая октава состоит из двенадцати последовательных нот, часто отмечаемых:
A
A#
B
C
C#
D
D#
E
F
F#
G
G#
Или:
La
La#
Si
Do
Do#
Re
Re#
Mi
Fa
Fa#
Sol
Sol#
В этой системе мы считаем, что две последовательные ноты (например, A
и A#
, или E
и F
) разделены одним полутоном. Кроме того, заметки являются своего рода «зацикливанием»: то, что сразу следует, G#
- A
.
Аккорд состоит из нескольких (2, 3, 4, иногда больше) нот, которые «звучат хорошо вместе». Например, триадические аккорды содержат три разные ноты, а седьмые аккорды содержат четыре разные ноты.
Давайте определим четыре триадических аккорда как:
Большая триада : содержит корень аккорда (в этом вопросе примечание, приведенное в качестве входных данных), главную треть для корня (на 4 полутона выше, чем корень) и идеальную пятую для корня (на 7 полутонов выше, чем корень). ); это может быть символизировано 0-4-7
Малая триада , символизирует 0-3-7
Дополненная триада , символизирует 0-4-8
Уменьшенная триада , символизированная 0-3-6
Так, например, если вы хотите сделать мажорную триаду , отметили C
, CM
, Cmaj
, вам нужно будет три отметили:
- 0: корень , в данном случае
C
- 4: минорная треть , на 4 полутона выше корня; это
E
- 7: идеальный пятый , 7 полутонов выше, чем корень:
G
Это то , что 0-4-7
, 0-3-7
, 0-4-8
и 0-3-6
условные обозначения используются выше среднего! Для седьмых аккордов используйте следующий шаблон:
На сегодня все! Теперь удивите меня удивительным кодом ... Если у вас есть какие-либо вопросы, добавьте несколько комментариев ниже.
Db+
этоDb F A
нет D # или G там. Это, возможно, немного больше теории, чем необходимо, формулы были важной частью. Если вы действительно хотите включить все восемь из седьмых аккордов, перечисленных в википедии, вы должны указать вход. Я предполагаю, что выход ascii-art из фортепиано и гитары является гибким.Ответы:
BBC BASIC
Эмулятор на bbcbasic.co.uk
Rev 1, 340 - 150 клавишных - 150 играющих = 40
Вот последняя версия, в которой мне удалось включить следующие улучшения, удлинив при этом еще на несколько символов.
Ввод можно удобно редактировать на экране перед нажатием клавиши return ( раньше я использовал GET $ для получения однократных нажатий клавиш, потому что BBC Basic не позволяет получить доступ к одному символу из строки, как если бы строка была массивом. Теперь я использую довольно громоздкая функция MID $ для извлечения строки из одного символа из строки.
Отображаются обе стороны клавиатуры, а также полная линия между E и F.
Чтобы компенсировать символы, добавленные выше, я переставил программу, чтобы исключить ненужные операторы печати, и удалил некоторые пробелы, которые на первый взгляд выглядели так, как будто их нельзя удалить. В BBC Basic все встроенные функции являются зарезервированными словами, и вы можете поместить имя переменной прямо перед ними без пробела между ними. Имена переменных не могут начинаться с зарезервированного слова. Чтобы сделать программу менее запутанной для чтения, я изменил все переменные на строчные.
Хотя презентация выглядит намного лучше, следующая программа уже
полностью отработана.(См. Исправление ниже.) Обычно символы новой строки и двоеточия взаимозаменяемы, за исключением случаев, когда используется оператор IF. В этом случае все операторы в одной строке (разделенные двоеточиями) должны быть выполнены условно. Выражения после новой строки не контролируются IF и всегда будут выполняться.Программа рев 1 340 символов
ИСПРАВЛЕНИЕ: RT Bassic для Windows от RT Russell позволяет исключить некоторые новые строки и двоеточия, в результате чего общее количество сокращается до 327, см. Ниже. Кроме того, перед сохранением он разбивает ключевые слова на отдельные символы, уменьшая их до 279.
Выходная версия 1
Rev 0, 337 - 150 клавишных - 150 играющих = 37Это похоже на мой ответ Arduino, но я всегда знал, что смогу побить этот счетчик байтов с помощью BBC basic. Только распознает острые предметы, но считает B # недействительным, вы должны поставить C. Это можно исправить, если это действительно считается важным.
Я отказался от идеи гитары и сосредоточился на улучшении клавиатуры. Теперь он работает от C до B, и я добавил в левой части клавиатуры строку между E и F. Это стоит 28 символов. Правая сторона не будет намного больше.
Вот пример выходных данных, аккорд с уменьшенным A # (в этой инверсии звучит довольно странно) и мажорный аккорд B. Обратите внимание, что ввод не отображается на экране. Согласно ответу Arduino, поверните экран против часовой стрелки для просмотра.
Неуправляемая версия
источник
Как вы можете сказать, я вообще не пытался играть в гольф. Я - фанат музыки, и моя любимая мозоль - это когда люди пишут вещи с использованием неправильной эхармоники (например, говорят, что аккорд с уменьшенным Си - это CD # F # вместо C Eb Gb), поэтому я написал эту программу, которая получает энгармонику правильно. Это делается путем представления каждой ноты как числа совершенных пятых над F.
Для чего стоит, если вы хотите различить энгармонику, любой музыкальный интервал может быть красиво представлен в компьютерной программе как число идеальных пятых и октав. Например, расширенная четверть - это 6 идеальных пятых и -3 октавы, а уменьшенная пятая - это -6 идеальных пятых и 4 октавы.
Haskell, 441 персонажа
Некоторые примеры вызовов:
источник
Arduino
Вход / выход отправляется на / принимается от Arduino через COM-порт. Пользователь может взаимодействовать с этим через терминал или последовательный монитор в Arduino IDE. Как вы уже догадались из моего выбора платформы, я планирую включить фактическую игру аккорда (хотя я еще этого не сделал).
Я успешно справился с бонусом на клавиатуру и попытался справиться с гитарой, но с ограниченным успехом.
Поле аккордов занимает 130 байтов, что слишком долго, чтобы того стоить. Поэтому я попробовал другой способ, просто печатая стиль табуляции ладных чисел. В настоящее время это 81 байт для бонуса 81-100 = -19. Если этот подход считается действительным, я могу попытаться улучшить его.
Используются аккорды всех форм D-типа с корнем на 2-й строке, пятым на 3-й строке и третьим на 1-й и 4-й строках. 5-я и 6-я строки не используются, и я отмечаю это X в правой части поля аккордов (слева будет более обычным, но примеры, отмеченные справа, можно найти.)
Поскольку программа рассматривает F как самую низкую ноту (для совместимости с клавиатурой, избегая при этом чрезмерно высоких ладов с этой формой аккорда), самая высокая аккорд - это E (с корнем на 17-м ладу). См. Пример выходных данных.
Клавиатура более удачна с точки зрения игры в гольф. Он запускается из FE, а не CB по причинам, описанным выше. Его нужно просматривать, поворачивая экран на 90% против часовой стрелки, когда вы можете четко видеть контуры черных нот и разграничение между белыми нотами с помощью
---
. Линия между B a C может быть расширена еще____
на несколько байтов.Я попробую сыграть ноты дальше. Это будет интересно, потому что, хотя я считаю, что Arduino Uno имеет 3 внутренних таймера, только одна нота за раз может быть воспроизведена с помощью встроенной тональной команды. Существует функция внешней библиотеки, которая использует все аппаратные таймеры (которые будут портить последовательный порт, но в любом случае на этом этапе он не понадобится). В качестве альтернативы я могу попытаться воспроизвести тональные сигналы в более мягкой форме.
Если мне это удастся, я проиграю, но не думаю, что это будет абсолютный победитель.
Код без правил
Пример вывода Чем меньше расстояние между строками текста, тем лучше это выглядит. Поэтому, когда я редактирую сообщение, оно выглядит великолепно, но ужасно в сером поле после публикации. Вместо этого я опубликовал снимок экрана серийного монитора Arduino с промежуточным межстрочным интервалом (и, следовательно, с качеством отображения).
источник
Python3 - 315 символов
Впервые в Codegolf! Поддерживает только минорные, мажорные, уменьшенные и расширенные аккорды прямо сейчас.
источник
'C C# D D# E F F# G G# A A# B'.split(' ')
вместо вашего литерального массива, чтобы сохранить несколько байтов.if('#'in a):j+=1
->if'#'in a:j+=1
= 2 символа меньше на каждое утверждение. Кроме того, измененияy
кrange()
экспрессии тоже сохраняет что - то. Добро пожаловать! (и помните, что переводы строк тоже считаются;))'C C# D D# E F F# G G# A A# B'.split()
;)y
для хранения[1,2,4,5,6]
, почему бы вам просто не пропуститьy
и заменить строку 4for i in[1,2,4,5,6]:
? В любом случае, добро пожаловать в Codegolf, и я надеюсь, вам здесь будет весело.Python 506 (юникод как 1 символ) -150 (звук) -150 (клавиатура) = 206
Для воспроизведения звука он использует
pygame.midi
. Обратите внимание, чтоpygame.midi.get_default_output_id()
метод работает не очень хорошо. Таким образом , вы можете попытаться изменить линиюo=Output(get_default_output_id())
кo=Output(1)
,o=Output(2)
и т.д. Обычно правильное значение находится в пределах от 0 до 5.Полученные результаты
источник
J - 82 символа
Автономный, читает из консоли ввода. Если вам нужен стандартный ввод, измените финал
1
на3
. Не претендует на бонусы, а только покрывает триады.Вместо резкой ноты, например,
C#
вы должны использовать эквивалентное плоское имяDb
. (Исправление для этого приведет к раздуванию кода более чем на несколько раз.) Четыре типа аккордов предназначены0
для уменьшающихся,m
для минорных,M
для мажорных и+
для дополненных.Логика следующая: мы используем последний символ для добавления смещения к основанию 0-3-6, которое выбирает вид третьего и пятого. Тем временем мы используем заметку, чтобы найти, где в шкале вытащить заметки. И то, и
;:
другое делает примечание совместимым с индексированием в масштабе в начале, а затем (путем&.
) превращает вытянутые примечания в разделенную пробелами строку.Пример использования:
источник
Javascript, 224 символа
Это мой первый кодовый гольф. Я думаю, что это может быть короче, но я не могу найти байтов для сохранения.
Поддерживает основные,
m
для несовершеннолетнего,0
за уменьшенный,+
для дополненная, или 37 байт для болееdim
,aug
.источник
n[m]==0
можно просто!n[m]
. То же самое относится и к другому месту. Всего вы можете легко отрезать 6 символов .n
как строка,n[m]==0
будет приведен0
к"0"
, так что он равенn[m]=="0"
."0" == 0
верно, но!"0"
ложно.AM
. Я тоже могу ошибаться.Питон (
143134 знака)Мой первый вызов в гольф :), не знаю, можно ли сбрить еще несколько байтов.
Здесь используется обозначение * aug / + maj /, min / - dim.
Я заслуживаю бонусного очка за постоянную 42 в коде: P
источник
n,q,a='A A# B C C# D D# E F F# G G#'.split(),[4,4,3,3],input();m,i=ord(a[-1])-42,n.index(a[:-1])
Питон 3: 257 - 150 = 107
Всего 25 символов слишком долго, чтобы победить решение J! Ну что ж. Я думаю, здесь есть несколько интересных идей.
Ввод похож на примеры, хотя вы должны использовать точные имена вместо плоских имен. (например, Gb должен быть F #)
Выход - единственная октава фортепиано, видимая сверху и слева, с наложенными именами нот. Должно быть только крошечное воображение.
источник
CM
мы должны быть в состоянии читатьC E G
...bool(R)
наR|0
?bool(R)
1 (true), если не пусто, и 0 (false), если пусто.|
Оператор не работает со списками ...Scala 537 символов - 50
источник
Haskell, 273 символа
Полученные результаты
источник