Sortie "Mozart - Alla Turca" vers stdout (voir l'exemple pour "implémentation de référence")
Essayez de trouver comment emballer le synthétiseur et la musique dans une taille minimale.
Exigences:
- Format adapté à l'alimentation
aplay -f cd
(petit endian 16 bits signé, 2 canaux); - La musique entière doit être jouée (pas de notes ou de parties sautées, au moins pas moins que dans le programme d'échantillonnage), cependant la polyphonie n'est pas requise;
- Ne peut pas simplement appeler
/usr/bin/timidity
,/usr/bin/sox
ou quelque chose comme ça (par exemple exiger d'installer un module de musique spécial); - Impossible d'accéder au réseau ou de supposer que la musique est disponible localement;
"Implémentation de référence" avec un score analysable: https://gist.github.com/vi/5478693
(Ancien exemple de programme Perl: https://gist.github.com/vi/5447962 )
Réponses:
Polyphonique, Haskell,
282631774719Sortie audio: https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg
Fonctionnalités:
de la main droite . Je pourrais bien sûr ajouter la main gauche aussi(c'est fait).comme on monte sur un vrai pianoen fait, un peu plus ... hé cette pièce est supposée imiter des groupes de janissaires turcs , non?Voici une version partiellement non golfée et commentée: https://gist.github.com/leftaroundabout/5517198 .
la source
Python, 331 + 286 = 617 (0,548 octets par note)
Ma solution utilise un fichier de données et un script python. Le fichier de données doit être utilisé comme entrée dans le script. Je n'ai pas d'aplay, mais cela fonctionne lorsque je l'importe en tant que données brutes dans Audacity avec PCM 16 bits signé, little-endian et 2 canaux.
Le fichier de données est de 331 octets. Voici un script python qui le génère:
Voici le script python:
Remarque: Si vous exécutez Windows, utilisez le
-u
commutateur pour les deux scripts car stdin et stdout traitent des données binaires.la source
os.read/write
au lieu desys.stdin/stdout
.GolfScript (129 + 369 = 498 octets)
Le programme et le fichier de données contiennent des caractères non imprimables, donc je vais donner des représentations Base64 et xxd.
Programme (129 octets):
Données (369 octets):
Explication
J'ai modifié le score fourni (mis à jour) (plus à ce sujet plus tard) en une seule chaîne contenant des octets avec des valeurs de 0 à 24. La longueur des notes vient en premier; puis les valeurs de note, représentées par le mod 25 et codées par différence. La raison du codage différentiel est que les passages qui sont répétés en transposition seront réduits à la même séquence et pourront être compressés.
J'ai ensuite exécuté cela à travers un programme de compression chaîne vers GolfScript que j'ai mentionné précédemment (et que j'ai amélioré afin d'être compétitif dans ce golf) pour obtenir le fichier de données, qui est décompressé par la première partie du programme:
Il s'agit d'une simple extension grammaticale d'un type familier à tous ceux qui ont examiné de nombreuses questions étiquetées kolmogorov-complexité .
J'ai ensuite divisé cette chaîne en paires
[length note]
et parcouru les paires. Les caractères non imprimables proviennent d'une chaîne magique qui contient des paramètres de fréquence pour les notes: j'utilise le module 256 de troncature implicite de tableaux entiers qui sont convertis en chaînes pour produire une onde triangulaire *, donc la fréquence de base est 22050/256 Hz. J'ai écrit un programme pour trouver des ratios entiers qui donnent un bon réglage; la chaîne magique contient des numérateurs et le dénominateur 17 est le même pour toutes les notes. L'erreur de réglage moyenne est d'environ 3,4 cents.Les longueurs des notes sont représentées telles quelles et sont beaucoup plus plausibles que la version précédente de la partition. Comme je le soupçonnais, l'arrondi a augmenté la redondance dans la chaîne et raccourci le fichier de données compressé de 30 octets, sans parler de l'enregistrement du tableau de recherche. Cependant, il y a encore quelques passages que je trouve suspect:
ou
donner des barres qui sont un sixième de crochet plus longues que les autres barres de la partition, et
ou
sont un nombre entier de barres, mais avec quelques décalages douteux.
Le programme pourrait être légèrement plus court. J'ai délibérément choisi d'échanger la brièveté contre le temps d'exécution. Avec quelques améliorations de vitesse à l'interpréteur GolfScript que j'ai soumises à Darren Smith et que je pense qu'il prévoit de publier à un moment donné, la version actuelle s'exécute en moins de 15 minutes sur mon ordinateur. Si je ne
puts
note pas chaque note après l'avoir générée, elle s'exécute beaucoup plus lentement.* J'avoue par la présente que mon commentaire sur tout le monde utilisant des ondes carrées était faux.
la source
base64 -d <<< 'MjU2Y.....9Lw==' |
golfscript et ça ditgolfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)
(pareil si j'enregistre le programme dans un fichier, bien sûr)㔲戶獡㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/
), j'obtiensundefined method
class_id 'pour nil: NilClass`Code machine x86 - 513 octets
Cela ne relève pas entièrement le défi, car au lieu de produire dans un format adapté à l'alimentation d'un jeu, il joue le midi.
Fichier .COM exécutable et code source asm - Le démarrage de la musique peut prendre jusqu'à 14 secondes. Il jouera également un peu lentement, car la résolution de la minuterie est de 1/18 de seconde.
La musique est codée en 375 octets en utilisant le codage Fibonacci et un dictionnaire composé de la musique décodée précédemment.
Algorithme de décodage de pseudocode:
Une fois la musique décodée, il suffit de la sortir sur le port Midi.
la source