Saída "Mozart - Alla Turca" para stdout (consulte o exemplo para "implementação de referência")
Tente descobrir como compactar o sintetizador e a música em tamanho mínimo.
Requisitos:
- Formato adequado para alimentação
aplay -f cd
(endian assinado de 16 bits, 2 canais); - Toda a música deve ser tocada (sem notas ou partes puladas, pelo menos não menos do que no programa de amostra); a polifonia não é necessária;
- Não pode simplesmente chamar
/usr/bin/timidity
,/usr/bin/sox
ou algo parecido (por exemplo, requer a instalação de um módulo especial de música); - Não pode acessar a rede ou assumir que a música está disponível localmente;
"Implementação de referência" com pontuação analisável: https://gist.github.com/vi/5478693
(Exemplo de programa Perl de amostra: https://gist.github.com/vi/5447962 )
Respostas:
Polifônico, Haskell,
282631774719Saída de áudio: https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg
Recursos:
da mão direita . É claro que eu também poderia adicionar a mão esquerda(Fiz isso).como se você pegasse um piano de verdadena verdade, um pouco mais ... ei, essa peça deveria estar imitando as bandas turcas dos janízaros , certo?Aqui está uma versão parcialmente não-gasta e comentada: https://gist.github.com/leftaroundabout/5517198 .
fonte
Python, 331 + 286 = 617 (0.548 bytes por nota)
Minha solução usa um arquivo de dados e um script python. O arquivo de dados deve ser usado como entrada para o script. Não tenho aplay, mas funciona quando os importo como dados brutos no Audacity com PCM assinado de 16 bits, little endian e 2 canais.
O arquivo de dados tem 331 bytes. Aqui está um script python que o exibe:
Aqui está o script python:
Nota: Se você estiver executando o Windows, use a
-u
opção para os dois scripts, já que stdin e stdout estão lidando com dados binários.fonte
os.read/write
vez desys.stdin/stdout
.GolfScript (129 + 369 = 498 bytes)
O programa e o arquivo de dados incluem caracteres não imprimíveis, portanto, darei representações Base64 e xxd.
Programa (129 bytes):
Dados (369 bytes):
Explicação
Eu alterei a pontuação fornecida (atualizada) (mais sobre isso mais tarde) em uma única sequência contendo bytes com valores de 0 a 24. Os comprimentos das notas são os primeiros; então os valores das notas, representados mod 25 e codificados por diferença. A razão para a codificação da diferença é que as passagens que são repetidas na transposição serão reduzidas para a mesma sequência e podem ser compactadas.
Em seguida, executei isso por meio de um programa de compactação string-to-GolfScript que mencionei antes (e que melhorei para ser competitivo nesse golfe) para obter o arquivo de dados, que é descompactado pela primeira parte do programa:
É uma expansão gramatical simples de um tipo que é familiar para quem já viu muitas perguntas marcadas com complexidade kolmogorov .
Em seguida, divido essa sequência em pares
[length note]
e iteramos pelos pares. Os caracteres não imprimíveis vêm de uma sequência mágica que contém parâmetros de frequência para as notas: Estou usando o mod de truncamento implícito do GolfScript 256 de matrizes inteiras que são convertidas em strings para produzir uma onda triangular *, portanto a frequência base é 22050/256 Hz. Eu escrevi um programa para encontrar proporções inteiras que dão um bom ajuste; a seqüência mágica contém numeradores e o denominador 17 é o mesmo para todas as notas. O erro médio de ajuste é de cerca de 3,4 centavos.Os comprimentos das notas são representados como estão e são muito mais plausíveis que a versão anterior da partitura. Como eu suspeitava, o arredondamento aumentou a redundância na string e reduziu o arquivo de dados compactados em 30 bytes, sem mencionar o salvamento da matriz de pesquisa. No entanto, ainda existem algumas passagens que acho suspeitas:
ou
dê barras com um sexto de crochê mais do que o resto das barras na partitura, e
ou
são um número inteiro de barras, mas com algumas compensações duvidosas.
O programa pode ser um pouco mais curto. Eu escolhi deliberadamente negociar em falta pelo tempo de execução. Com algumas melhorias na velocidade do intérprete GolfScript que enviei para Darren Smith e que acredito que ele planeja publicar em algum momento, a versão atual é executada em menos de 15 minutos no meu computador. Se eu não fizer
puts
cada nota depois de gerá-la, ela ficará muito mais lenta.* Confesso que meu comentário sobre todo mundo que usa ondas quadradas estava errado.
fonte
base64 -d <<< 'MjU2Y.....9Lw==' |
golfscript e dizgolfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)
(o mesmo se eu salvar o programa em arquivo, é claro)㔲戶獡㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/
), receboundefined method
class_id 'for nil: NilClass`Código da máquina x86 - 513 bytes
Isso não atende totalmente ao desafio, pois, em vez de produzir em um formato adequado para alimentar o aplay, ele toca midi.
Arquivo .COM executável e código-fonte do ASM - pode demorar até 14 segundos para a música iniciar. Também tocará um pouco devagar, pois a resolução do timer é 1/18 de segundo.
A música é codificada em 375 bytes usando a codificação Fibonacci e um dicionário composto pela música decodificada anteriormente.
Algoritmo de decodificação de pseudocódigo:
Depois que a música é decodificada, é simples enviá-la para a porta Midi.
fonte