Quines musicais em um piano ASCII

22

Existem 88 teclas em um piano padrão e 95 caracteres ascii imprimíveis (códigos hexadecimais 20 a 7E):

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

('caractere' refere-se a qualquer caractere ASCII imprimível a partir de agora)

Em deste jsFiddle eu tomei vantagem disso e fez uma sintaxe simples que gera melodias de piano usando AudioSynth . (Se alguém puder me direcionar para um conjunto vinculável de sons reais de notas de piano, ficarei grato.)

Cada caractere na sequência de entrada () 01+-corresponde a uma tecla do 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

Assim, RPNPRRRreproduz os primeiros 7 notas de Mary Had a Little Lamb utilizando os parâmetros predefinidos que você pode ver na jsFiddle.

Espaço ( ) representa um descanso musical que dura um intervalo de uma nota. RPNPRRR PPP RUUToca assim as primeiras 13 notas de Mary Had a Little Lamb com descansos em seus devidos lugares.

Se qualquer caractere adicional ()01for prefixado por uma sequência de 0's 1' (regex [01]+), essa sequência será lida como um número binário b , e o caractere será substituído por b cópias de si mesmo. Assim, 101A11 10+1-0B01Ctorna-se AAAAA ++-Cpois 101= 5, 11= 3, etc. (Uma sequência de 0's e 1' s no final da cadeia de caracteres tem nenhum efeito).

Parênteses correspondentes ( ()) têm duas finalidades:

  1. Se o conteúdo deles não terminar com uma sequência de 0'e 1', todas as notas serão tocadas ao mesmo tempo que um acorde (que, caso contrário, não será diferente de uma nota). O mesmo (NQU)ocorre com um acorde C menor na oitava 4.
    Se houver notas duplicadas, o som também será duplicado. Então, (NN)e (NNN)soa diferente.
  2. Se o seu conteúdo faz final com uma sequência de 0's e 1' s, essa sequência é lido como um número binário b , e os parênteses e o seu conteúdo são substituídos com b cópias do conteúdo. Assim, (NQU11)torna-se 9 notas individuais: NQUNQUNQU.

Detalhes dos parênteses:

  • Aninhar parênteses de replicação (finalidade 2) é bom: (N(QU10)11)(NQUQU11)NQUQUNQUQUNQUQU.
  • Aninhar parênteses não replicantes (finalidade 1) é bom, mas não tem efeito: (A((+)C))é o mesmo que (A+C).
  • Você também pode combinar os dois: ((N(QU10))11)(NQUQU)(NQUQU)(NQUQU).
  • Uma sequência de 0'e 1' antes de parênteses não replicantes os repete da mesma maneira que caracteres individuais são repetidos. Assim 10(NQU)se torna (NQU)(NQU).
  • Uma sequência de 0'e 1' antes de replicar parênteses não tem efeito.
  • (deve sempre ter uma correspondência ), mas não vice-versa: por exemplo, N)é válido.

Mais ( +) e menos ( -) aumentam e diminuem respectivamente a duração das notas ou o intervalo de tempo entre as notas, dependendo do seu contexto:

  • Quando no interior de nao reprodução parênteses, eles imediatamente aumentar ou diminuir a duração variável nota por algum número pré-definido de milissegundos (ver jsFiddle ). Então, (++)Nvai jogar Nem uma duração mais longa do que o normal.
  • Quando estão fora dos parênteses não replicantes, eles aumentam ou diminuem o intervalo entre o início da próxima nota e a nota após (e cada intervalo subsequente) em um número predefinido de milissegundos. Portanto, no ++NPintervalo entre Ne Pé maior que o normal.

A duração das notas e o intervalo de tempo entre elas não podem cair abaixo de 0.

Desafio

Eu escolhi intencionalmente () 01+-os 7 caracteres especiais porque eles podem ser colocados inocentemente em muitos contextos em muitas linguagens de programação.

Sua tarefa é escrever um quine em 512 bytes ou menos que produza a melhor melodia quando o próprio código é usado como a string de entrada no JSFiddle .

Você pode escolher qualquer valor inicial (números inteiros não negativos) para os 4 parâmetros de intervalo / duração, mas sua música não deve durar mais que 10 minutos. Você também deve nos dizer se a sua música soa melhor em um instrumento específico.

Regras

  • Somente guias, novas linhas e ASCII imprimível são permitidas no seu código. Todo ASCII não imprimível é ignorado pelo criador da melodia.
  • A saída pode ir para um arquivo ou stdout ou a alternativa mais próxima (por exemplo, alerta JS). Não há entrada.
  • Nenhuma leitura do código fonte. Deve ser uma verdadeira solução.
  • A remoção de quaisquer três caracteres de origem contíguos deve fazer com que o programa não funcione mais como um quine. Isso é para garantir que as pessoas não escrevam uma boa música em uma string e que tenham uma pequena porção de quine para produzi-la.
    • Então, se o seu programa foi MYCODE, em seguida MYC, MYE, MDEe ODEtodos devem não ser quines (eles podem erro ou saída de qualquer outra coisa).

Este é um concurso de popularidade, com a resposta mais votada.

Atualização: última regra relaxada.

Passatempos de Calvin
fonte
3
Você pode jogar Mary Had a Little Lamb num teclado de telefone, também: 3212333 222 399 (experimentá-lo, ele sai perfeitamente.)
Nível River St
Existem muitas fontes sonoras gratuitas para piano. Além disso, bom JSFiddle!
QWR
Nunca vi a última regra em nenhum desafio antes, acho que é bastante eficaz como pretendido.
justhalf
@qwr Você conhece algum conjunto de todas as 88 chaves que podem ser diretamente vinculadas dessa maneira ? Eu parecia um pouco, mas não consegui encontrar nenhum.
Hobbies de Calvin

Respostas:

6

C

Decidi que gostei do baixo ruído estridente gerado pela string, /**/que não é por acaso o caminho para abrir e fechar um comentário em C. A única outra parte interessante aqui é que 34para a "é substituído por 35-1(Terminando 1 intencionalmente) para evite acordes terríveis. Eu também tentei fazer o final parecer dramático. Eu realmente fiz. Pretendo editá-lo posteriormente para torná-lo um pouco melhor.

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

Para meu entendimento das regras, as seções comentadas ainda passam a regra final porque sua remoção resulta em uma falha na solução.

BrainSteel
fonte
3
"Pretendo editar isso mais tarde para parecer um pouco melhor." Já faz quase um ano. Estou começando a pensar que você não editará isso mais tarde para que pareça melhor. : P
Alex A.
@AlexA. Mais de um ano agora!
Wizzwizz4
5

J

Sim, acho que você pode adivinhar como isso vai acontecer.

É difícil fazer algo legal em J sem parênteses, e como você raramente pode terminá-los com 0s e 1s, a maioria das coisas soa como alguém sentado nas metades alta e baixa do teclado ao mesmo tempo. Eu tentei o meu melhor, você vai saber.

Aqui está uma linha de base descolada para piano, eu acho. Eu realmente não sei a primeira coisa sobre composição, eu apenas peguei um quine e girei os números um pouco.

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

E, apenas por diversão, jogue este como EDM. Eu chamo de Japhex Twin .

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

Você pode confirmar o quineiness desses finos trechos de código em tryj.tk .

algoritmshark
fonte
1
Isso realmente poderia passar para a música. Ótimo! :)
Emil
4

Musique Concreto com Python

Hoje não tenho muito tempo, mas queria obter uma resposta. O gênero é uma desculpa para não parecer nada. Talvez um efeito sonoro em um videogame?

BFIN10=r"print('BFIN10=r\"'+BFIN10+'\"'+'\nexec(BFIN10)')"
exec(BFIN10)
qwr
fonte
Na verdade, não parece tão ruim!
Claudiu 23/09
Todos os álbuns do Yoko Ono de todos os tempos
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)

Dividido com quebras de linha apenas para fins de apresentação; isso é apenas um quine (e só atende aos requisitos de comprimento) se novas linhas forem removidas.

A declaração printf foi necessária para compilar (printf). /*(*/e /*)*/foram usados ​​para combinar parênteses no código, enquanto uma mistura de parênteses e o operador de vírgula foram usados ​​para formar acordes a partir dos printfparâmetros.

Editar: Encurtado para atender aos requisitos de tamanho e tornar a peça um pouco mais rápida.

Isso soa melhor no piano.

es1024
fonte
2
Eu gosto disso! Começa meio lento, mas tudo, desde o token 130 em diante, é assustadoramente poderoso. Você usou a cantoria para sua vantagem.
Passatempos de Calvin
Este poderia passar por Fantasy for Orchestra! : P
Soham Chowdhury
2
Gostei mais da versão antiga, mas ainda é a minha música favorita aqui. Estou tentando lhe dar a recompensa, mas por algum motivo isso não está funcionando. Veja meta: meta.codegolf.stackexchange.com/questions/2263/…
Hobbies de Calvin
3

Esquema

Isso pode não ser particularmente melódico (na verdade, parece que alguém jogou um porco morto em um bebê grande), mas pelo menos é uma peça curta de música. Seria difícil criar algo muito mais longo ou menos no estilo de porco voador morto.

((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Penguino
fonte
1
Ai, meus ouvidos ...
Claudiu
2

Para Golfscript

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

Isso satisfaz a letra da regra de não remoção de três cartas consecutivas, embora não seja a intenção, pelo que entendi.

Claudiu
fonte
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

Tecnicamente, não é um problema no Lote (ele lê sua própria fonte). No entanto, é um problema em Cobra.

Soa melhor com o modo piano, um pouco como a música no nível fantasma de um videogame da era Super Mario World.

Furioso
fonte
1

Pyth

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

Melhor reproduzido com a quarta configuração (quantidade + e - intervalo de mudança) em torno de 20, permanecendo nos padrões. Soa melhor no piano.

isaacg
fonte
0

Haskell

(Não tenho certeza se o nome da variável viola a última regra.)

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

Melhor tocada no piano com duração de 1000 milissegundos e intervalo de 250 milissegundos, com valores padrão + e -.

archaephyrryx
fonte