Input : Warna hex RGBA c
(mis. FFFF00FF
) Dan integer> 0 dan <1000 n
(mis. 200
).
Output : Baku byte dari file PNG sehingga ketika output disimpan ke file dan dibuka di penampil gambar, seorang n
dengan n
gambar penuh dengan warna c
ditampilkan.
Spesifikasi : Program Anda harus menampilkan dengan tepat :
- header PNG (
89504E470D0A1A0A
dalam hex) - sebuah
IHDR
potongan yang berisi spesifikasi ini:- Lebar: input sebelumnya
n
- tinggi: input sebelumnya
n
- kedalaman bit:
8
(RGBA
) - jenis warna:
6
(truecolor dengan alpha) - metode kompresi:
0
- metode filter:
0
- metode interlace:
0
- Lebar: input sebelumnya
- satu atau lebih
IDAT
potongan yang berisi data gambar (gambar padat warna yang sebelumnya diinputc
); dapat dikompresi atau tidak dikompresi - sebuah
IEND
potongan gambar akhir
Rincian lebih lanjut tersedia di Wikipedia , di situs W3 , atau melalui pencarian Google.
Pembatasan :
- Anda tidak boleh menggunakan perpustakaan gambar atau fungsi apa pun yang dirancang untuk bekerja dengan gambar apa pun.
- Program Anda harus berjalan dalam waktu kurang dari 3 menit dan menghasilkan file di bawah 10 MB untuk semua input (cek kewarasan).
- Ini adalah kode-golf , jadi kode terpendek dalam byte akan menang!
code-golf
graphical-output
Gagang pintu
sumber
sumber
999x999
file memiliki lebih dari 30720 piksel, sehingga tampaknya saling bertentangan.Jawaban:
Perl, 181
Ukurannya 180 byte dan opsi
-p
diperlukan (+1). Skornya kemudian 181.Argumen diberikan melalui STDIN dalam garis, dipisahkan oleh spasi, warna sebagai nilai hex (16 karakter) dan jumlah piksel untuk lebar / tinggi, misalnya:
Ukuran file adalah 832 byte. Gambar berukuran maksimal (n = 999) dengan warna yang sama memiliki 6834 byte (jauh di bawah 10 MB).
Solusinya menggunakan dua perpustakaan:
use Digest::CRC crc32;
untuk nilai CRC32 di ujung chunk.use IO::Compress::Deflate deflate;
untuk mengompres data gambar.Kedua perpustakaan tidak terkait dengan gambar.
Tidak Disatukan:
Suntingan
use IO::Compress::Deflate':all';
diganti olehuse Compress::Zlib;
. Yang terakhir memang mengekspor fungsi deflatecompress
secara default. Fungsi tidak memerlukan referensi sebagai argumen dan juga mengembalikan hasilnya secara langsung. Itu memungkinkan untuk menyingkirkan variabel$o
.Terima kasih atas jawaban Michael :
Fungsi
k
: Panggilanpack
dapat dihapus dengan menggunakan templatNa*N
untuk yang pertamapack
dalam fungsi.pack
templateNNCV
dengan empat nilai dioptimalkanNNC3n
dengan enam nilai.Terima kasih atas komentar VadimR dengan banyak tips:
use String::CRC32;
lebih pendek dariuse Digest::CRC crc32;
.y///c-4
lebih pendek dari-4+y///c
.CH*
dengan pengulangan dalam nilai.$i
dengan menggunakan referensi nilai.-p
) dengan mencocokkan pemisah ruang/ /
. Kemudian opsi pertama ada$`
dan argumen kedua masuk$'
.-p
juga mencetak secara otomatis$_
."\cZ"
lebih pendek dari"\x1a"
.Kompresi yang lebih baik
Dengan mengorbankan ukuran kode, data gambar dapat dikompresi lebih lanjut, jika penyaringan diterapkan.
Ukuran file tanpa filter untuk
FFFF0FF
200
: 832 bytesFilter
Sub
(perbedaan piksel horizontal): 560 byteSaring
Sub
untuk baris pertama danUp
untuk baris lainnya: 590 bytePertama tanpa filter baris, lalu filter
Up
: 586 bytesJuga
Compress::Zlib
bisa disetel; tingkat kompresi tertinggi dapat diatur dengan opsi tambahan untuk tingkat kompresi berfungsicompress
dengan biaya dua byte:Ukuran file misalnya
yellow200.png
tanpa penyaringan menurun dari 832 byte menjadi 472 byte. Diterapkan pada contoh denganSub
filter, ukuran file menyusut dari 560 byte menjadi 445 byte (pngcrush -brute
tidak dapat memampatkan lebih lanjut).sumber
-p
. Selain wawasan dalam jawaban Michael (NA*N
danNNCV
templat), -String::CRC32
ekspor secara default,y///c-4
tidak apa-apa,CH*
templat,$i
hilang\cZ
,, kata kunci bar OK,-p
dan/ /;
menempatkan argumen ke dalam pra-tanding dan pascas-tanding . Saya ingin tahu apakah saya melewatkan sesuatu dan skornya bisa di bawah 200 :)use Compress::Zlib;
dan mendapat ≈ 10% di bawah 200.PHP 214
Saya bukan ahli PHP, ada tempat untuk bermain golf. Tips disambut.
Buat file PNG:
Hasilkan aliran base64 (rekatkan hasilnya di bilah alamat browser Anda)
Versi tidak disatukan:
sumber
Python, 252 byte
Script ini mengambil input dari argv. Jalankan skrip ini dari baris perintah, misalnya
python 27086.py deadbeef 999
sumber