На стандартном пианино имеется 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 (они могут ошибки или вывести что - то еще).
- Так что, если ваша программа была
Это конкурс популярности, за который проголосовал самый высокий голос.
Обновление: расслабленное последнее правило.