Quines musicales sur un piano ASCII


22

Il y a 88 touches sur un piano standard et 95 caractères ascii imprimables (codes hexadécimaux 20 à 7E):

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

('caractère' fait référence à tout caractère ASCII imprimable à partir d'ici)

Dans ce JSFiddle, j'ai profité de cela et créé une syntaxe simple qui génère des morceaux de piano à l'aide d' AudioSynth . (Si quelqu'un peut me diriger vers un ensemble liable de réel sons de notes de piano , je serai reconnaissant.)

Chaque caractère de la chaîne d'entrée () 01+-correspond en outre à une touche de piano:

 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

RPNPRRRJoue donc les 7 premières notes de Mary Had a Little Lamb en utilisant les paramètres de timing prédéfinis que vous pouvez voir dans le JSFiddle.

L'espace ( ) représente un repos musical qui dure pendant un intervalle de note. RPNPRRR PPP RUUJoue donc les 13 premières notes de Mary Had a Little Lamb avec des restes à leur place.

Si un caractère en plus ()01est préfixé par une séquence de 0'et 1' (regex [01]+), cette séquence est lue comme un nombre binaire b , et le caractère est remplacé par b copies de lui-même. Devient 101A11 10+1-0B01Cainsi AAAAA ++-Cparce que 101= 5, 11= 3, etc. (Une séquence de 0'et 1' à la fin de la chaîne n'a aucun effet.)

Les parenthèses appariées ( ()) remplissent deux fonctions:

  1. Si leur contenu ne se termine pas par une séquence de 0'et 1', toutes les notes sont jouées en même temps qu'un accord (qui autrement n'est pas différent d'une note). Il en (NQU)va de même d'un accord en do mineur sur l'octave 4.
    Si des notes en double sont présentes, leur son est également dupliqué. Donc (NN)et (NNN)sonner différemment.
  2. Si leur contenu ne fin avec une séquence de 0« s et 1d », cette séquence est lue comme un nombre binaire b , et les parenthèses et leur contenu sont remplacés par b copies du contenu. Donc , (NQU11)devient 9 notes individuelles: NQUNQUNQU.

Détails entre parenthèses:

  • L'imbrication des répliques de parenthèses (objectif 2) est correcte: (N(QU10)11)(NQUQU11)NQUQUNQUQUNQUQU.
  • L'imbrication de parenthèses non réplicatives (objectif 1) est correcte mais n'a aucun effet: (A((+)C))est identique à (A+C).
  • Vous pouvez également combiner les deux: ((N(QU10))11)(NQUQU)(NQUQU)(NQUQU).
  • Une séquence de 0«et 1» avant les parenthèses non réplicables les répète de la même manière que les caractères individuels sont répétés. Ainsi 10(NQU)devient (NQU)(NQU).
  • Une séquence de 0«et 1» avant de répliquer les parenthèses n'a aucun effet.
  • (doit toujours avoir une correspondance ), mais pas l'inverse: par exemple N)est valide.

Plus ( +) et moins ( -) augmentent et diminuent respectivement la durée des notes ou l'intervalle de temps entre les notes, selon leur contexte:

  • À l' intérieur de parenthèses non réplicatives, elles augmentent ou diminuent immédiatement la variable de durée de note d'un certain nombre de millisecondes prédéfini (voir JSFiddle ). Alors , (++)Nva jouer Nà une durée plus longue que la normale.
  • En dehors des parenthèses non réplicatives, elles augmentent ou diminuent l'intervalle entre le début de la note suivante et la note qui la suit (et chaque intervalle suivant) d'un certain nombre prédéfini de millisecondes. Donc, dans ++NPl'intervalle entre le Net Pest plus long que d'habitude.

La durée des notes et l'intervalle de temps entre elles ne peuvent pas descendre en dessous de 0.

Défi

J'ai intentionnellement choisi () 01+-d'être les 7 caractères spéciaux car ils peuvent être placés de manière inoffensive dans de nombreux contextes dans de nombreux langages de programmation.

Votre tâche consiste à écrire un quine en 512 octets ou moins qui produit la meilleure mélodie sonore lorsque le code lui-même est utilisé comme chaîne d'entrée dans le JSFiddle .

Vous pouvez choisir toutes les valeurs initiales (entiers non négatifs) pour les 4 paramètres d'intervalle / durée, mais votre morceau ne doit pas durer plus de 10 minutes. Vous devriez également nous dire si votre morceau sonne le mieux dans un instrument particulier.

Règles

  • Seuls les onglets, les nouvelles lignes et les caractères ASCII imprimables sont autorisés dans votre code. Tout ASCII non imprimable est ignoré par le créateur de la mélodie.
  • La sortie peut aller vers un fichier ou une sortie standard ou l'alternative la plus proche (par exemple, alerte JS). Il n'y a aucune entrée.
  • Pas de lecture du code source. Ce doit être une vraie quine.
  • La suppression de 3 caractères source contigus doit faire en sorte que le programme ne fonctionne plus comme un quine. C'est pour s'assurer que les gens n'écrivent pas une bonne chanson dans une chaîne, puis qu'ils ont une petite portion de quine pour la sortir.
    • Donc , si votre programme était MYCODEalors MYC, MYE, MDEet ODEdevrait ne pas être tout Quines (ils peuvent erreur ou quelque chose de sortie autre).

Il s'agit d'un concours de popularité, la réponse la plus votée l'emporte.

Mise à jour: dernière règle détendue.


3
Vous pouvez également jouer Mary Had a Little Lamb sur un clavier de téléphone: 3212333 222 399 (essayez-le, il sort parfaitement.)
Level River St

Il existe de nombreuses polices sonores gratuites pour piano. Aussi, belle JSFiddle!
qwr

Je n'ai jamais vu la dernière règle dans un défi auparavant, aussi efficace que prévu, je pense.
moitié du

@qwr Connaissez-vous des ensembles de 88 touches pouvant être directement liées de cette manière ? J'ai regardé un peu mais je n'en ai pas trouvé.
Calvin's Hobbies

Réponses:


6

C

J'ai décidé que j'aimais le faible bruit de grondement généré par la chaîne, /**/ce qui n'est pas une coïncidence pour ouvrir et fermer un commentaire en C. Le seul autre élément intéressant ici est que 34pour un "est remplacé par 35-1(Fin 1 intentionnellement) pour éviter les accords horribles. J'ai également essayé de rendre le son final dramatique. Je l'ai vraiment fait. J'ai l'intention de le modifier plus tard pour le rendre un peu meilleur.

/**/char*p= "/**/char*p= %c%s%c; int main(){printf(p,34,p,35-1);p++;/**/}/**/";
int main(){printf(p,34,p,35-1);p++;/**/}/**/

À ma connaissance des règles, les sections commentées transmettent toujours la règle finale car leur suppression entraîne l'échec d'un quine.


3
"J'ai l'intention de le modifier plus tard pour le rendre un peu meilleur." Cela fait presque un an. Je commence à penser que vous ne le modifierez pas plus tard pour améliorer le son. : P
Alex A.

@AlexA. Plus d'un an maintenant!
wizzwizz4

5

J

Ouais, je pense que vous pouvez deviner comment ça va se passer.

Il est difficile de faire quelque chose de cool en J sans parens, et comme vous pouvez rarement les terminer avec des 0 et des 1, la plupart des choses ressemblent à quelqu'un assis sur les moitiés hautes et basses du clavier en même temps. J'ai fait de mon mieux, je te le ferai savoir.

Voici une ligne de base géniale pour le piano, je pense. Je ne connais vraiment pas la première chose à propos de la composition, j'ai juste saisi une quine et tourné un peu les chiffres.

(23 23,~,~i.124+-100){,'(23 23,~,~i.124+-100){,'''

Et, juste pour le plaisir, jouez celui-ci en tant qu'EDM. Je l'appelle Japhex Twin .

".s=:'''".s=:'',''''''''&,@(,&'''''''')@(#~>:@(=&''''''''))s'

Vous pouvez confirmer la quineiness de ces beaux extraits de code à tryj.tk .


1
Cela pourrait en fait passer pour la musique. Génial! :)
Emil

4

Musique Concrete avec Python

Je n'ai pas beaucoup de temps aujourd'hui mais je voulais obtenir une réponse. Le genre est une excuse pour ne pas ressembler à rien. Peut-être un effet sonore dans un jeu vidéo?

BFIN10=r"print('BFIN10=r\"'+BFIN10+'\"'+'\nexec(BFIN10)')"
exec(BFIN10)

En fait, ça ne sonne pas trop mal!
Claudiu

Chaque album de Yoko Ono jamais
William Barbosa

4

C

int(printf)(char*,...); (main)(){char*b=",*",i=(34),*m=("int(printf)(char*,...); (main)(){char*b="),
*z="%s%c%s%c,i=(34),*m=(%c%s%c)%sz=%c%s%c,*B=%c%s%c,*f=(%c%s%c)%s(/*)*/%s/*(*/);}//(+++fim)",*B="(f,
i,m,z),(i,z,m),(m,i),(f,b),(m,i),(m,i),(f,z,m),(m,i),(f,z,b),(m,i),(b,z),(B,i),(38,i),(29,B),(26,i),
(26,i),(B,f),(42,i),(i,m,f),B",*f=(";(printf)");(printf)(/*)*/(f,i,m,z),(i,z,m),(m,i),(f,b),(m,i),(m
,i),(f,z,m),(m,i),(f,z,b),(m,i),(b,z),(B,i),(38,i),(29,B),(26,i),(26,i),(B,f),(42,i),(i,m,f),B/*(*/)
;}//(+++fim)

Découpé avec des sauts de ligne à des fins de présentation uniquement; ce n'est qu'une quine (et ne répond aux exigences de longueur) que si les sauts de ligne sont supprimés.

La déclaration printf était nécessaire pour la compilation (printf). /*(*/et /*)*/ont été utilisés pour faire correspondre les parenthèses dans le code, tandis qu'un mélange de parenthèses et l'opérateur virgule ont été utilisés pour former des accords à partir des printfparamètres.

Édition: raccourci pour s'adapter aux exigences de taille et rendre la pièce un peu plus rapide.

Cela sonne mieux au piano.


2
Je l'aime! Cela commence un peu lentement, mais tout, à partir du jeton 130, est puissamment obsédant. Vous avez utilisé le cri à votre avantage.
Calvin's Hobbies

Celui-ci pourrait passer pour Fantasy for Orchestra! : P
Soham Chowdhury

2
J'ai mieux aimé l'ancienne version mais c'est toujours ma chanson préférée ici. J'essaie de vous donner la prime, mais pour une raison quelconque, cela ne fonctionne pas. Voir meta: meta.codegolf.stackexchange.com/questions/2263/…
Calvin's Hobbies

3

Schème

Ce n'est peut-être pas particulièrement mélodique (en fait, on dirait que quelqu'un a fait tomber un cochon mort dans un baby-grand), mais au moins c'est un court morceau de musique. Il serait difficile de faire quelque chose de beaucoup plus long ou moins semblable à un cochon volant mort.

((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))

1
Aïe, mes oreilles ....
Claudiu

2

Für Golfscript

":H;GHGHCFDA;[34]H+2*{-};":H;GHGHCFDA;[34]H+2*{-};

Cela satisfait la lettre de la règle de non-suppression de trois lettres consécutives, mais pas l'intention, je suppose.


1

Cobra / Lot

@number float# 2>nul||@echo off
/# 2>nul
for /f "delims=" %%a in (%0) do echo %%a
#/# 2>nul
class P# 2>nul
    def main# 2>nul
        r="# 2>nul"# 2>nul
        s="@number float{3}||@echo off{2}/{3}{2}for /f {1}delims={1} %%a in (%0) do echo %%a{2}#/{3}{2}class P{3}{2}    def main{3}{2}      r={1}{3}{1}{3}{2}       s={1}{0}{1}{3}{2}       Console.write(s,s,34to char,10to char){3}"# 2>nul
        Console.write(s,s,34to char,10to char,r)# 2>nul

Techniquement pas un quine dans Batch (il lit sa propre source). C'est cependant une quine chez Cobra.

Cela sonne mieux avec le mode piano, un peu comme la musique de niveau fantôme d'un jeu vidéo de l'ère Super Mario World.


1

Pyth

J"+K+N+J+N+\K+N+K+NJ"K"J"+K+N+J+N+\K+N+K+NJ

Meilleur jeu avec le quatrième réglage (quantité + et - intervalle de changement) à environ 20, reste aux valeurs par défaut. Sonne mieux au piano.


0

Haskell

(Je ne sais pas si le nom de la variable viole la dernière règle.)

main=putStr$  jjlmjiebab ++ {--} show jjlmjiebab;jjlmjiebab = "main=putStr$  jjlmjiebab ++ {--} show jjlmjiebab;jjlmjiebab = "

Meilleur jeu au piano avec une durée de note de 1000 millisecondes et un intervalle de notes de 250 millisecondes, avec des valeurs standard + et -.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.