Sim, você leu o título certo. toque o som de pi.
Mais especificamente, para cada dígito de pi nos primeiros 1000, mapeie-o para uma nota musical e emita a melodia resultante em um arquivo.
Basicamente, cada dígito passa para uma nota na escala C Maior (basicamente a escala normal). então 1 vira para o meio C, 2 vira para D4, 3 vira para E4, 9 vira para D5 e assim por diante.
Regras
- Cada nota deve ter exatamente 0,5 segundos de duração.
- A melodia deve conter os primeiros 1000 dígitos de pi, incluindo os 3 iniciais.
- 1 a 7 representam o meio C a B4, 8 é C5, 9 é D5 e 0 é E5
- Todos os formatos de arquivo suportados são permitidos, desde que tenham sido criados antes deste desafio.
- Pode não haver pausas em nenhum lugar do arquivo, incluindo o início e o fim.
- O instrumento tocado não importa. Poderia ser um piano, onda senoidal, qualquer coisa realmente, desde que o som correto seja facilmente ouvido.
- Ele não deve receber entrada e não produzir saída, exceto para o arquivo. A leitura de outros arquivos não é permitida.
- As brechas padrão são proibidas.
Exemplo de código mathematica:
(*please forgive me for this horrible, horrible mess of code*)
digits = RealDigits[Pi, 10, 1000][[1]] /. {0 -> 10};
weights = {0, 2, 4, 5, 7, 9, 11, 12, 14, 16};
melody = {};
For[i = 1, i < 1001, i++, melody = {melody , Sound[SoundNote[weights[[digits[[i]]]], 0.5]]}]
final = Sound[Flatten[melody]];
Export["C:\\Mathematica Shenanigans\\pi.wav", final];
Exemplo de melodia mostrando os primeiros 100 dígitos: http://vocaroo.com/i/s0cfEILwYb8M
Para sua sanidade, uma tabela de arremessos para cada nota e que nota representa cada dígito:
Digit 1: C: 261.63 Hz
Digit 2: D: 293.66 Hz
Digit 3: E: 329.63 Hz
Digit 4: F: 349.23 Hz
Digit 5: G: 392.00 Hz
Digit 6: A: 440.00 Hz
Digit 7: B: 493.88 Hz
Digit 8: C5: 523.25 Hz
Digit 9: D5: 587.33 Hz
Digit 0: E5: 659.25 Hz
code-golf
kolmogorov-complexity
pi
audio
sagiksp
fonte
fonte
4
oitava oitava. Além disso, na sua tabela o dígito0
vem por último (E5
)?Respostas:
Mathematica,
10787 bytesAgradecemos a Martin Ender por economizar 20 bytes!
#&@@RealDigits[Pi,10,1000]
fornece a lista dos primeiros 1000 dígitos de π.SoundNote[⌊12Mod[#,10,1]/7⌋-1
produz o número correto da afinação (onde 0 é C médio por padrão) a partir de um dígito. Em seguida,SoundNote[...,.5]&/@
transforma o nome do tom em um objeto de som com duração de 1/2 segundo, que seSound
reúne em um snippet de áudio real. Finalmente,"t.au"~Export~
exporta para um arquivo em formato de áudio Unix, principalmente porque a extensão é a mais curta suportada, mas também porque podemos fazer do nome do arquivo um tapa na cara de π !Submissão anterior:
fonte
Python 2, 182 bytes
`x`
irá produzir31415926...20198L
. O finalL
é usado para produzir o byte final da mensagem do canal, através do mapeamento~ord(i)%29
.Produz um arquivo Midi Tipo 1 de faixa única, nomeado
p.mid
para o diretório de trabalho atual.fonte
Zero , 530 bytes
Inspirado pela resposta do BookOwl .
Demonstração Online . A reprodução começará imediatamente, pressione spacepara parar e redefinir. Clique no gato para começar de novo.
Edit: jogou um pouco para baixo. Encontrei algumas dicas de golfe no wiki oficial .
Gráfico:
Usa a torneira Rabinowitz Wagon para produzir 4 dígitos por vez.
fonte
R, 450 bytes
Usa o pacote
Rmpfr
para obter a precisão correta nos dígitos pi. Produz um.wav
arquivo.Recuado, com novas linhas e comentários:
fonte
C (gcc) 572 bytes
Versão não destruída:
Explicação:
play(float freq)
A rotina recebe a frequência como um parâmetro da nota (codificada) que você deseja tocar e armazena uma onda senoidal em um buffer.f()
, armazenei as frequências correspondentes às notas que variam de C4 a E5 em umnotes
matriz.pi
valor seguido por 1000 dígitos em um buffer. Para fazer isso, instalei opi
pacote na minha máquina e useipopen
para ler a saídapi 1000
e armazená-la em umchar
buffer.for
loop eswitch
chamei aplay()
função para produzir notas que correspondem a cada dígito nopi
buffer. ,Uso:
./binary_name.o | aplay
nas distribuições modernas do Linux, nas distribuições mais antigas você o redirecionaria para/dev/audio
fonte
switch(foo){...}
por algo parecidoplay(note[(foo-'1')%10])
. Além disso, ler dicas para golfe em C