На стандартном пианино имеется 88 клавиш и 95 печатных символов ascii (шестнадцатеричные коды от 20 до 7E):
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(«символ» относится к любому печатному символу ASCII с этого момента)
В этом JSFiddle я воспользовался этим и создал простой синтаксис, который генерирует мелодии для фортепиано с использованием AudioSynth . (Если кто-нибудь может направить меня на связываемый набор настоящих звуков фортепианной ноты, я буду благодарен.)
Каждый символ во входной строке, кроме того, () 01+-
соответствует одной клавише пианино:
CHARACTER: ! " # $ % & ' * , . / 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
KEY NUMBER: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
NOTE: A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C
OCTAVE: 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 8
Так RPNPRRR
играет первые 7 нот Мэри был барашек с использованием заданных параметров синхронизации вы можете увидеть в JSFiddle.
Пробел ( ) представляет музыкальный отдых, который длится один интервал нот. Так
RPNPRRR PPP RUU
звучит первые 13 нот Марии «Ягненок» с остатками на своих местах.
Если какой-либо символ помимо этого ()01
имеет префикс последовательности 0
's и 1
' (regex [01]+
), эта последовательность читается как двоичное число b , и символ заменяется на b копий самого себя. Так 101A11 10+1-0B01C
становится AAAAA ++-C
потому, что 101
= 5, 11
= 3 и т. Д. (Последовательность 0
's 1
' и 's' в конце строки не имеет никакого эффекта.)
Соответствующие скобки ( ()
) служат двум целям:
- Если их содержание не заканчивается последовательностью
0
's' и1
's', все ноты воспроизводятся одновременно с аккордом (который в остальном не отличается от ноты). Так(NQU)
что до минор 4 - до минор .
Если присутствуют дублирующие ноты, их звук также дублируется. Так(NN)
и(NNN)
звучат по другому. - Если их содержание делает конец с последовательностью
0
«s и1
» s, эта последовательность считывается в виде двоичного числа б , и в скобках и их содержание заменяются б копии контента. Так(NQU11)
становится 9 отдельных нот:NQUNQUNQU
.
Детали круглых скобок:
- Вложенные реплицирующие скобки (цель 2) - это хорошо:
(N(QU10)11)
→(NQUQU11)
→NQUQUNQUQUNQUQU
. - Вложенные неповторяющиеся скобки (цель 1) хороши, но не имеют никакого эффекта:
(A((+)C))
то же самое, что и(A+C)
. - Вы также можете комбинировать оба:
((N(QU10))11)
→(NQUQU)(NQUQU)(NQUQU)
. - Последовательность
0
's' и1
's' перед неповторяющимися скобками повторяет их так же, как повторяются отдельные символы. Так10(NQU)
становится(NQU)(NQU)
. - Последовательность
0
's' и1
's' перед копированием скобок не имеет никакого эффекта. (
всегда должен иметь соответствие)
, но не наоборот: напримерN)
, допустимо.
Плюс ( +
) и минус ( -
) соответственно увеличивают и уменьшают продолжительность заметок или временной интервал между заметками, в зависимости от их контекста:
- Находясь внутри неповторяющихся скобок, они немедленно увеличивают или уменьшают переменную длительности ноты на некоторое заданное количество миллисекунд (см. JSFiddle ). Так
(++)N
будет игратьN
дольше, чем обычно. - Когда снаружи нереплицирующегося круглых скобки, они увеличивают или уменьшают интервал между началом следующей ноты и нотами после него (и каждого последующего интервала) с помощью некоторого заданного числа миллисекунд. Так что в
++NP
промежутке междуN
иP
больше, чем обычно.
Длительность нот и временной интервал между ними не могут быть ниже 0.
Вызов
Я намеренно выбрал () 01+-
7 специальных символов, потому что они могут быть безобидно размещены во многих контекстах во многих языках программирования.
Ваша задача состоит в том, чтобы написать квинну в 512 байт или меньше, которая обеспечивает наилучшее звучание, когда сам код используется в качестве входной строки в JSFiddle .
Вы можете выбрать любые начальные значения (неотрицательные целые числа) для 4 параметров интервала / продолжительности, но ваша мелодия не должна длиться более 10 минут. Вы также должны сообщить нам, лучше ли звучит ваша мелодия на конкретном инструменте.
правила
- В вашем коде разрешены только вкладки, переводы строк и printable-ASCII. Все непечатаемые ASCII игнорируются создателем мелодии.
- Вывод может идти в файл или стандартный вывод или ближайшую альтернативу (например, предупреждение JS). Там нет ввода.
- Нет чтения исходного кода. Должно быть, это настоящий куайн.
- Удаление любых трех смежных исходных символов должно привести к тому, что программа больше не будет работать как квин. Это сделано для того, чтобы люди не написали хорошую песню в строке, а затем получили крошечную часть для вывода.
- Так что, если ваша программа была
MYCODE
тогдаMYC
,MYE
,MDE
иODE
все должны быть не quines (они могут ошибки или вывести что - то еще).
- Так что, если ваша программа была
Это конкурс популярности, за который проголосовал самый высокий голос.
Обновление: расслабленное последнее правило.