На стандартному піаніно є 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 нот Mary of Little Little Lamb, використовуючи задані параметри часу, які ви можете побачити в JSFiddle.
Пробіл ( ) являє собою музичний відпочинок, який триває один інтервал нот. Тож
RPNPRRR PPP RUU
грає перші 13 нот Мері Мало ягняти з упорами на своїх місцях.
Якщо будь-який символ крім ()01
префіксується послідовністю 0
's і 1
s (regex [01]+
), ця послідовність читається як двійкове число b , і символ замінюється b копіями самого себе. Так 101A11 10+1-0B01C
стає AAAAA ++-C
тому, що 101
= 5, 11
= 3 і т. Д. (Послідовність 0
'і 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
'і1
' s перед неповторюваними дужками повторює їх так само, як повторюються окремі символи. Так10(NQU)
стає(NQU)(NQU)
. - Послідовність
0
'і1
' s перед реплікацією дужок не впливає. (
завжди має відповідати)
, але не навпаки: наприклад,N)
це дійсно.
Плюс ( +
) і мінус ( -
) відповідно збільшують і зменшують тривалість нотаток або часовий інтервал між нотами, залежно від їх контексту:
- Якщо знаходяться в не повторюваних дужках, вони негайно збільшують або зменшують змінну тривалості ноти на деяку задану кількість мілісекунд (див. JSFiddle ). Так
(++)N
буде гратиN
довше, ніж зазвичай. - Якщо знаходяться поза дужками, що не повторюються, вони збільшують або зменшують інтервал між початком наступної ноти та нотою після неї (та кожним наступним інтервалом) на деяку задану кількість мілісекунд. Отже в
++NP
проміжку між іN
іP
довше, ніж зазвичай.
Тривалість нотаток та часовий інтервал між ними не можуть опускатися нижче 0.
Виклик
Я навмисно вибрав () 01+-
7 спеціальних персонажів, оскільки їх можна беззаперечно розмістити в багатьох контекстах на багатьох мовах програмування.
Ваше завдання - написати quine в 512 байт або менше, що створює найкращу мелодію звучання, коли сам код використовується як вхідний рядок у JSFiddle .
Ви можете вибрати будь-які початкові значення (невід’ємні цілі числа) для 4 параметрів інтервалу / тривалості, але ваша настройка не повинна тривати більше 10 хвилин. Ви також повинні сказати нам, чи звучить ваша мелодія найкраще на певному інструменті.
Правила
- У вашому коді дозволені лише вкладки, нові рядки та ASCII для друку. Створювач мелодії ігнорує всю ASCII, що не роздруковується.
- Вихід може перейти у файл або stdout або найближчу альтернативу (наприклад, JS-попередження). Введення немає.
- Немає читання вихідного коду. Це повинно бути справжньою королевою.
- Видалення будь-яких 3 суміжних символів-джерела повинно змусити програму більше не функціонувати як ланцюжок. Це робиться для того, щоб люди не писали гарну пісню в рядку, а потім мали крихітну частину квітки, щоб вивести її.
- Так що, якщо ваша програма була
MYCODE
тодіMYC
,MYE
,MDE
іODE
всі повинні бути не quines (вони можуть помилки або вивести що - то ще).
- Так що, якщо ваша програма була
Це конкурс популярності, виграє найвища відповідь.
Оновлення: розслаблене останнє правило.