"Sebuah gambar bernilai ribuan kata" —jadi pepatah lama berbunyi. Panjang rata-rata kata adalah sekitar empat karakter, sehingga sebuah gambar menyampaikan informasi 4kB. Tetapi seberapa banyak entropi , dan bukannya informasi, yang dapat disampaikan gambar?
Tugas Anda adalah menghasilkan gambar, tepatnya berukuran 4.000 byte, dengan entropi setinggi mungkin. Anda dapat menggunakan bahasa, pustaka, atau format gambar apa pun yang Anda pilih, dan Anda dapat menampilkan ke konsol atau ke file selama Anda mengunggah gambar Anda di sini.
Mencetak gol
Skor Anda adalah rasio kompresi (4000 ÷ ukuran terkompresi) ketika gambar Anda dikompres dengan GNU tar
versi 1.28 dan gzip
versi 1.6, menggunakan algoritma DEFLATE dan pengaturan default - khususnya, perintah tar -czvf out.tar.gz image
. Rasio kompresi terkecil menang.
tar
termasuk metadata, termasuk mtime, dalam file output secara default. Ini memengaruhi ukuran file terkompresi akhir - beberapa waktu mengkompres lebih baik daripada yang lain. Mengubah perintah untukgzip -n image
akan membuat ukuran output menjadi deterministik terlepas dari mtime (dan nama file input).gzip -n image
tidak dapat menghasilkan file yang lebih besar dari 4023 byte yang diberikan input 4000-byte. Perlu 10 byte untuk header, 8 untuk footer, 1 untuk header blok dan padding DEFLATE, dan 4 untuk ukuran blok DEFLATE; sisanya hanya disimpan sebagai byte yang tidak terkompresi. Sebagian besar file yang terdiri dari bit acak disimpan tanpa kompresi, sebagaimana mestinya.Jawaban:
0.9514747859 (output 4204-byte)
Catatan: gambar di atas bukan file yang sebenarnya saya gunakan, tetapi itu adalah gambar.
Berikut adalah hexdump dari file tersebut: https://gist.github.com/pommicket/cf2982e8ecf09a4de89d3a849526c64b
File ini dalam format netpbm , dan dapat dibuat dengan kode C ini:
Benih acak harus diteruskan ke program. Setelah mencoba beberapa biji, saya mendapatkan satu yang menghasilkan file gzipped 4204 byte. Seperti yang ditunjukkan Nnnes,
tar
akan memasukkan metadata dalam file tersebut, sehingga hasil Anda mungkin berbeda dengan milik saya.netpbm tidak didukung di mana-mana, tetapi ia bekerja dengan imagemagick
convert
(jadi lakukan sajaconvert image.pgm image.png
untuk mengubahnya menjadi png).Mengapa ini gambar / format?
File yang seluruhnya terdiri dari byte acak sangat sulit untuk dikompres (pada kenyataannya, setiap algoritma kompresi yang mungkin akan dilakukan rata-rata, tidak lebih baik daripada tidak memampatkan untuk file acak). Isi dari file aktual hanya
P5 2 1993
diikuti oleh 3986 byte acak, itulah sebabnya gzip mengalami kesulitan mengompresnya.sumber
IHDR
,IDAT
danIEND
potongan, tetapi sebagian besar generator PNG akan menyertakan beberapa potongan opsional yang kemungkinan akan dikompres dengan baik - seperti kata Grimy - kecuali mungkin CRC yang dapat diasumsikan cukup acak.Brainfuck, 4201 byte dikompresi.
Format gambar yang digunakan adalah PNG. Saya cukup yakin tantangannya sudah selesai karena saya akan menyisakan 4 skrip yang dimodifikasi dalam semalam.
Penjelasan
Jadi bagaimana cara kerjanya?
Menggunakan program Java, saya membuat file JPG. Kemudian, itu dikompresi dan ukurannya sedang diperiksa meminta saya saya akan menyimpannya. Saya menjalankan skrip ini untuk sementara waktu dan menghasilkan beberapa
tar.gz
file dengan berbagai ukuran. Kemudian, setelah pemenang baru ditemukan, kode Brainfuck dibuat ulang.Skrip Bash yang digunakan:
Cuplikan layar program yang sedang berjalan:
Ini bisa sepenuhnya otomatis menghapus pembacaan dan menyimpannya secara implisit, tetapi saya ingin memiliki kendali atasnya.
Kode
sumber
brainfuck
, dan memperbarui skor Anda ke rasio kompresi?