Quines musicales en un piano ASCII

22

Hay 88 teclas en un piano estándar y 95 caracteres ascii imprimibles (códigos hexadecimales 20 a 7E):

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

('carácter' se refiere a cualquier carácter ASCII imprimible de aquí en adelante)

En este JSFiddle , aproveché eso e hice una sintaxis simple que genera melodías de piano usando AudioSynth . (Si alguien puede dirigirme a un conjunto enlazable de sonidos de notas de piano reales , lo agradeceré).

Cada carácter en la cadena de entrada además () 01+-corresponde a una tecla 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

Entonces RPNPRRRtoca las primeras 7 notas de Mary Had a Little Lamb usando los parámetros de tiempo preestablecidos que puedes ver en el JSFiddle.

El espacio ( ) representa un descanso musical que dura un intervalo de nota. Entonces RPNPRRR PPP RUUtoca las primeras 13 notas de Mary Had a Little Lamb con restos en sus lugares apropiados.

Si cualquier carácter además ()01está prefijado por una secuencia de 0'sy 1' s (expresión regular [01]+), esa secuencia se lee como un número binario b , y el carácter se reemplaza con b copias de sí mismo. Entonces se 101A11 10+1-0B01Cvuelve AAAAA ++-Cporque 101= 5, 11= 3, etc. (Una secuencia de 0'sy 1' s al final de la cadena no tiene ningún efecto).

Los paréntesis coincidentes ( ()) tienen dos propósitos:

  1. Si su contenido no termina con una secuencia de 0'sy 1', todas las notas se tocan al mismo tiempo que un acorde (que de lo contrario no es diferente a una nota). Entonces, (NQU)es un acorde de Do menor en la octava 4.
    Si hay notas duplicadas, su sonido también se duplica. Así (NN)y (NNN)suena diferente.
  2. Si su contenido hace extremo con una secuencia de 0's y 1' s, esa secuencia se lee como un número binario b , y los paréntesis y su contenido son reemplazados con b copias del contenido. Así (NQU11)se convierte en 9 notas individuales: NQUNQUNQU.

Detalles de paréntesis:

  • Anidar paréntesis de replicación (propósito 2) está bien: (N(QU10)11)(NQUQU11)NQUQUNQUQUNQUQU.
  • Anidar paréntesis no replicantes (propósito 1) está bien pero no tiene ningún efecto: (A((+)C))es lo mismo que (A+C).
  • También puede combinar ambos: ((N(QU10))11)(NQUQU)(NQUQU)(NQUQU).
  • Una secuencia de 0'sy 1' antes de los paréntesis no replicantes los repite de la misma manera que se repiten los caracteres individuales. Así se 10(NQU)convierte (NQU)(NQU).
  • Una secuencia de 0'sy 1' antes de replicar paréntesis no tiene ningún efecto.
  • (siempre debe tener una coincidencia ), pero no al revés: por ejemplo, N)es válido.

Más ( +) y menos ( -) aumentan y disminuyen respectivamente la duración de las notas o el intervalo de tiempo entre las notas, según su contexto:

  • Cuando están dentro de paréntesis que no se replican, aumentan o disminuyen inmediatamente la variable de duración de la nota en un número predeterminado de milisegundos (ver JSFiddle ). Por (++)Nlo tanto , jugará Na una duración más larga de lo normal.
  • Cuando se encuentran fuera del paréntesis no replicativo, aumentan o disminuyen el intervalo entre el inicio de la siguiente nota y la nota siguiente (y cada intervalo posterior) en un número predeterminado de milisegundos. Entonces, en ++NPel intervalo entre el Ny Pes más largo de lo habitual.

La duración de las notas y el intervalo de tiempo entre ellas no puede caer por debajo de 0.

Reto

Elegí intencionalmente () 01+-ser los 7 caracteres especiales porque se pueden colocar de forma inocuo en muchos contextos en muchos lenguajes de programación.

Su tarea es escribir una quine en 512 bytes o menos que produzca la mejor melodía de sonido cuando el código en sí se utiliza como la cadena de entrada en el JSFiddle .

Puede elegir cualquier valor inicial (enteros no negativos) para los 4 parámetros de intervalo / duración, pero su melodía no debe durar más de 10 minutos. También debe decirnos si su melodía suena mejor en un instrumento en particular.

Reglas

  • Solo se permiten pestañas, líneas nuevas y ASCII imprimible en su código. El creador de melodías ignora todos los ASCII no imprimibles.
  • La salida puede ir a un archivo o stdout o la alternativa más cercana (por ejemplo, alerta JS). No hay entrada
  • Sin lectura del código fuente. Debe ser una verdadera quine.
  • La eliminación de los 3 caracteres de origen contiguos debe hacer que el programa ya no funcione como una quine. Esto es para garantizar que las personas no escriban una buena canción en una cadena y luego tengan una pequeña porción de quine para emitirla.
    • Así que si su programa era MYCODEentonces MYC, MYE, MDE, y ODEtodos deben ser quines no (pueden error o una salida de otra cosa).

Este es un concurso de popularidad, gana la respuesta más votada.

Actualización: última regla relajada.

Pasatiempos de Calvin
fuente
3
También puedes jugar a Mary Had a Little Lamb en el teclado de un teléfono: 3212333 222 399 (pruébalo, sale perfectamente.)
Level River St
Hay muchas fuentes de sonido gratuitas para piano. Además, agradable JSFiddle!
qwr
Nunca he visto la última regla en ningún desafío antes, creo que es bastante eficaz según lo previsto.
justhalf
@qwr ¿Conoce algún conjunto de las 88 teclas que se pueden vincular directamente de esta manera ? Miré un poco pero no pude encontrar ninguno.
Hobbies de Calvin

Respuestas:

6

do

Decidí que me gustaba el bajo ruido retumbante generado por la cadena, /**/que no es casualidad la forma de abrir y cerrar un comentario en C. El único otro aspecto interesante aquí es que 34para un "se reemplaza por 35-1(Terminando 1 intencionalmente) para evita acordes horribles. También intenté hacer que el final sonara dramático. Realmente lo hice. Tengo la intención de editar esto más tarde para que suene un poco mejor.

/**/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++;/**/}/**/

A mi entender de las reglas, las secciones comentadas aún pasan la regla final porque su eliminación da como resultado una falla fallida.

BrainSteel
fuente
3
"Tengo la intención de editar esto más tarde para que suene un poco mejor". Ha pasado casi un año. Estoy empezando a pensar que no editarás esto más tarde para que suene mejor. : P
Alex A.
@AlexA. ¡Más de un año ahora!
wizzwizz4
5

J

Sí, creo que puedes adivinar cómo va a ir esto.

Es difícil hacer algo genial en J sin parens, y dado que rara vez puedes terminar con 0s y 1s, la mayoría de las cosas suenan como alguien sentado en las mitades altas y bajas del teclado al mismo tiempo. Hice mi mejor esfuerzo, quiero que lo sepas.

Aquí hay una línea de base funky para piano, creo. Realmente no sé lo primero sobre la composición, simplemente agarré una quine y giré un poco los números.

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

Y, solo por diversión, juega este como EDM. Yo lo llamo Japhex Twin .

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

Se puede confirmar la quineiness de estos fragmentos finos de código en tryj.tk .

Algoritmo de tiburón
fuente
1
Esto en realidad podría pasar por la música. ¡Excelente! :)
Emil
4

Musique Hormigón con Pitón

Hoy no tengo mucho tiempo, pero quería obtener una respuesta. El género es una excusa para no sonar a nada. ¿Quizás un efecto de sonido en un videojuego?

BFIN10=r"print('BFIN10=r\"'+BFIN10+'\"'+'\nexec(BFIN10)')"
exec(BFIN10)
qwr
fuente
En realidad no suena tan mal!
Claudiu
Cada álbum de Yoko Ono
William Barbosa
4

do

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)

Romper con saltos de línea solo para fines de presentación; esto es solo una quine (y solo cumple con los requisitos de longitud) si se eliminan las nuevas líneas.

La declaración printf era necesaria para compilar (printf). /*(*/y /*)*/se usaron para hacer coincidir los paréntesis en el código, mientras que una combinación de paréntesis y el operador de coma se usaron para formar acordes a partir de los printfparámetros.

Editar: acortado para adaptarse a los requisitos de tamaño, así como para que la pieza vaya un poco más rápido.

Esto suena mejor en el piano.

es1024
fuente
2
¡Me gusta! Comienza un poco lento, pero todo, desde el token 130 en adelante, es inquietantemente inquietante. Usaste el chillido para tu ventaja.
Aficiones de Calvin
¡Este podría pasar por Fantasy for Orchestra! : P
Soham Chowdhury
2
Me gustó más la versión anterior, pero esta sigue siendo mi canción favorita aquí. Estoy tratando de darte la recompensa, pero por alguna razón eso no funciona. Ver meta: meta.codegolf.stackexchange.com/questions/2263/…
Calvin's Hobbies
3

Esquema

Esto puede no ser particularmente melódico (en realidad, parece que alguien dejó caer un cerdo muerto en un baby-grand), pero al menos es una pequeña pieza musical. Sería difícil hacer algo mucho más largo o menos esqueleto como un cerdo volador muerto.

((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Penguino
fuente
1
Ow, mis oídos ...
Claudiu
2

Für Golfscript

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

Esto satisface la letra de la regla de eliminación de tres letras consecutivas, aunque no la intención, entiendo.

Claudiu
fuente
1

Cobra / Lote

@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

Técnicamente no es una quine en Batch (lee su propia fuente). Sin embargo, es una quine en Cobra.

Suena mejor con el modo de piano, algo así como la música de nivel fantasma de un videojuego de la era mundial Super Mario.

Οurous
fuente
1

Pyth

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

Se juega mejor con el cuarto ajuste (cantidad + y - intervalo de cambio) alrededor de 20, descansa en los valores predeterminados. Suena mejor en el piano.

isaacg
fuente
0

Haskell

(No estoy seguro de si el nombre de la variable viola la última regla).

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

Se toca mejor en piano con una duración de nota de 1000 milisegundos y un intervalo de nota de 250 milisegundos, con valores estándar + y -.

Archaephyrryx
fuente