Keluarkan "Mozart - Alla Turca" ke stdout (lihat contoh untuk "implementasi referensi")
Cobalah temukan cara mengemas synthesizer dan musik ke dalam ukuran minimal.
Persyaratan:
- Format yang cocok untuk dimasukkan ke dalam
aplay -f cd
(ditandatangani endian 16-bit, 2 saluran); - Seluruh musik harus dimainkan (tanpa catatan atau bagian yang dilompati, setidaknya tidak kurang dari dalam program sampel), polifoni tidak diperlukan;
- Tidak bisa begitu saja menelepon
/usr/bin/timidity
,/usr/bin/sox
atau sesuatu seperti itu (misalnya perlu menginstal modul musik khusus); - Tidak dapat mengakses jaringan atau menganggap bahwa musik tersedia secara lokal;
"Implementasi referensi" dengan skor parsable: https://gist.github.com/vi/5478693
(Program Perl sampel lama: https://gist.github.com/vi/5447962 )
Jawaban:
Polifonik, Haskell,
282631774719Output audio: https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg
Fitur:
dari tangan kanan . Tentu saja saya bisa menambahkan tangan kiri juga(melakukan itu).seperti kamu bermain piano sungguhansebenarnya, agak lebih ... hei bagian ini seharusnya meniru band Janissary Turki , kan?Berikut ini adalah versi yang sebagian tidak diklik dan dikomentari: https://gist.github.com/leftaroundabout/5517198 .
sumber
Python, 331 + 286 = 617 (0,548 byte per not)
Solusi saya menggunakan file data dan skrip python. File data harus digunakan sebagai input ke skrip. Saya tidak memiliki aplay, tetapi berfungsi ketika saya mengimpornya sebagai data mentah dalam Audacity dengan PCM 16-bit, little-endian, dan 2 saluran yang ditandatangani.
File data adalah 331 byte. Berikut skrip python yang menampilkannya:
Berikut skrip python:
Catatan: Jika Anda menjalankan Windows, gunakan
-u
sakelar untuk kedua skrip karena stdin dan stdout berurusan dengan data biner.sumber
os.read/write
bukansys.stdin/stdout
.GolfScript (129 + 369 = 498 bytes)
Baik program dan file data termasuk karakter yang tidak diinginkan, jadi saya akan memberikan representasi Base64 dan xxd.
Program (129 byte):
Data (369 byte):
Penjelasan
Saya telah mengubah skor yang disediakan (diperbarui) (lebih lanjut tentang itu nanti) ke dalam string tunggal yang berisi byte dengan nilai dari 0 hingga 24. Panjang nada datang lebih dulu; kemudian nilai not, diwakili mod 25 dan perbedaan-disandikan. Alasan untuk pengkodean perbedaan adalah agar bagian-bagian yang diulang dalam transposisi akan dikurangi ke urutan yang sama dan dapat dikompresi.
Saya kemudian menjalankan ini melalui program kompresi string-ke-GolfScript yang telah saya sebutkan sebelumnya (dan yang saya tingkatkan agar dapat bersaing dalam golf ini) untuk mendapatkan file data, yang didekompresi oleh bagian pertama dari program:
Ini adalah perluasan tata bahasa sederhana dari tipe yang akrab bagi siapa saja yang melihat banyak pertanyaan dengan kompleksitas kolmogorov .
Saya kemudian membagi string ini menjadi berpasangan
[length note]
dan beralih melalui pasangan. Karakter yang tidak dapat dicetak berasal dari string ajaib yang berisi parameter frekuensi untuk catatan: Saya menggunakan mod pemotongan GolfScript 256 256 array integer yang dikonversi ke string untuk menghasilkan gelombang segitiga *, sehingga frekuensi dasar adalah 22050/256 Hz. Saya menulis sebuah program untuk menemukan rasio integer yang memberikan penyesuaian yang baik; string ajaib berisi pembilang, dan penyebut 17 adalah sama untuk semua catatan. Kesalahan penyetelan rata-rata adalah sekitar 3,4 sen.Panjang not direpresentasikan seperti apa adanya, dan jauh lebih masuk akal daripada versi skor sebelumnya. Seperti yang saya duga, pembulatan telah meningkatkan redundansi dalam string dan memperpendek file data terkompresi sebesar 30 byte, belum lagi menyimpan array pencarian. Namun, masih ada beberapa bagian yang saya anggap mencurigakan:
atau
berikan bilah yang merupakan keenam dari kaitan yang lebih panjang dari bilah lainnya dalam skor, dan
atau
adalah jumlah integral dari bar, tetapi dengan beberapa offset yang meragukan.
Program bisa sedikit lebih pendek. Saya sengaja memilih untuk berdagang pendek untuk waktu eksekusi. Dengan beberapa peningkatan kecepatan pada juru bahasa GolfScript yang telah saya kirimkan ke Darren Smith dan yang saya yakin dia berencana untuk menerbitkan di beberapa titik, versi saat ini berjalan dalam waktu kurang dari 15 menit di komputer saya. Jika saya tidak
puts
setiap catatan setelah menghasilkannya maka itu berjalan jauh lebih lambat.* Saya dengan ini mengakui bahwa komentar saya tentang semua orang yang menggunakan gelombang persegi salah.
sumber
base64 -d <<< 'MjU2Y.....9Lw==' |
golfscript dan dikatakangolfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)
(sama jika saya menyimpan program ke file, tentu saja)㔲戶獡㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/
), saya mendapatkanundefined method
class_id 'untuk nil: NilClass`Kode Mesin x86 - 513 Bytes
Ini tidak sepenuhnya memenuhi tantangan, karena alih-alih menghasilkan dalam format yang cocok untuk dimasukkan ke dalam aplay, ia memainkan midi.
File .COM dan kode sumber asm yang dapat dieksekusi - Diperlukan waktu hingga 14 detik untuk memulai musik. Ini juga akan bermain agak lambat, karena resolusi timer 1/18 detik.
Musik dikodekan dalam 375 byte menggunakan Fibonacci coding dan kamus yang terdiri dari musik yang sebelumnya diterjemahkan.
Algoritma Penguraian Kode Pseudocode:
Setelah musik diterjemahkan, itu adalah masalah sederhana untuk mengeluarkannya ke port Midi.
sumber