Latar Belakang
PICASCII adalah alat yang rapi yang mengubah gambar menjadi seni ASCII.
Ini mencapai tingkat kecerahan yang berbeda dengan menggunakan sepuluh karakter ASCII berikut:
@#+';:,.`
Kami akan mengatakan bahwa charxels (elemen karakter) ini memiliki kecerahan dari 1 (tanda-ke) hingga 10 (spasi).
Di bawah ini, Anda dapat melihat hasil dari konversi kode kecil, bendera Welsh, fraktal overhanded, trout besar dan golf kecil, ditampilkan dengan font yang benar:
Anda dapat melihat gambar di biola ini dan mengunduhnya dari Google Drive .
Tugas
Sementara hasil akhir dari PICASCII secara visual menyenangkan, kelima gambar yang digabungkan memiliki berat 153.559 byte. Berapa banyak gambar ini dapat dikompres jika kita mau mengorbankan sebagian dari kualitasnya?
Tugas Anda adalah menulis program yang menerima gambar seni ASCII seperti yang di atas dan kualitas minimum sebagai input dan mencetak kompresi gambar yang hilang - dalam bentuk program penuh atau fungsi yang mengembalikan satu string - yang memuaskan persyaratan kualitas.
Ini berarti Anda tidak dapat menulis dekompresor terpisah; itu harus built-in ke masing-masing gambar terkompresi.
Gambar asli akan terdiri dari charxels dengan kecerahan antara 1 dan 10, dipisahkan oleh garis-garis menjadi garis-garis dengan panjang yang sama. Gambar yang dikompres harus memiliki dimensi yang sama dan menggunakan serangkaian karakter yang sama.
Untuk gambar yang tidak terkompresi yang terdiri dari n charxels, kualitas dari versi gambar yang dikompres didefinisikan sebagai
di mana c i adalah kecerahan dari karakter ke- i dari output gambar terkompresi dan u i kecerahan dari karakter ke- i dari gambar yang tidak terkompresi.
Mencetak gol
Kode Anda akan dijalankan dengan lima gambar dari atas sebagai input dan pengaturan kualitas minimum 0,50, 0,60, 0,70, 0,80 dan 0,90 untuk masing-masing gambar.
Skor Anda adalah rata-rata geometris dari ukuran semua gambar terkompresi, yaitu, akar dua puluh lima produk dari panjang semua dua puluh lima gambar terkompresi.
Skor terendah menang!
Aturan tambahan
Kode Anda harus berfungsi untuk gambar sewenang-wenang, bukan hanya yang digunakan untuk mencetak gol.
Diharapkan bahwa Anda mengoptimalkan kode Anda terhadap kasus-kasus uji, tetapi sebuah program yang bahkan tidak mencoba untuk mengompres gambar yang sewenang-wenang tidak akan mendapatkan upvote dari saya.
Kompresor Anda mungkin menggunakan kompresor stream byte bawaan (misalnya, gzip), tetapi Anda harus menerapkannya sendiri untuk gambar yang dikompresi.
Bulit-in yang biasanya digunakan dalam dekompresi aliran byte (mis. Konversi basis, dekode run-length) diperbolehkan.
Kompresor dan gambar terkompresi tidak harus dalam bahasa yang sama.
Namun, Anda harus memilih satu bahasa untuk semua gambar terkompresi.
Untuk setiap gambar yang dikompresi, aturan golf kode standar berlaku.
Verifikasi
Saya telah membuat skrip CJam untuk dengan mudah memverifikasi semua persyaratan kualitas dan menghitung skor kiriman.
Anda dapat mengunduh juru bahasa Java dari sini atau di sini .
e# URLs of the uncompressed images.
e# "%s" will get replaced by 1, 2, 3, 4, 5.
"file:///home/dennis/codegolf/53199/original/image%s.txt"
e# URLs of the compressed images (source code).
e# "%s-%s" will get replaced by "1-50", "1-60", ... "5-90".
"file:///home/dennis/codegolf/53199/code/image%s-%s.php"
e# URLs of the compressed images (output).
"file:///home/dennis/codegolf/53199/output/image%s-%s.txt"
e# Code
:O;:C;:U;5,:)
{
5,5f+Af*
{
C[IQ]e%g,X*:X;
ISQS
[U[I]e%O[IQ]e%]
{g_W=N&{W<}&}%
_Nf/::,:=
{
{N-"@#+';:,.` "f#}%z
_::m2f#:+\,81d*/mq1m8#
_"%04.4f"e%S
@100*iQ<"(too low)"*
}{
;"Dimension mismatch."
}?
N]o
}fQ
}fI
N"SCORE: %04.4f"X1d25/#e%N
Contoh
Bash → PHP, skor 30344.0474
cat
Mencapai kualitas 100% untuk semua input.
$ java -jar cjam-0.6.5.jar vrfy.cjam 1 50 1.0000 1 60 1.0000 1 70 1.0000 1 80 1.0000 1 90 1.0000 2 50 1.0000 2 60 1.0000 2 70 1.0000 2 80 1.0000 2 90 1.0000 3 50 1.0000 3 60 1.0000 3 70 1.0000 3 80 1.0000 3 90 1.0000 4 50 1.0000 4 60 1.0000 4 70 1.0000 4 80 1.0000 4 90 1.0000 5 50 1.0000 5 60 1.0000 5 70 1.0000 5 80 1.0000 5 90 1.0000 SCORE: 30344.0474
sumber
Jawaban:
Java → CJam, skor ≈4417.89
Membutuhkan botol CJam di classpath. Jika Anda memberikannya 2 argumen baris perintah (nama file dan kualitas), itu menambahkan ".cjam" ke nama file dan menulis gambar terkompresi di sana. Kalau tidak, ia menghitung nilainya pada 5 gambar uji, yang dianggap berada di direktori saat ini. Program ini juga memverifikasi setiap gambar yang dikompres secara otomatis. Anda mungkin ingin memeriksa kembali perhitungan skor jika ada perbedaan.
Teknik yang digunakan (sejauh ini) adalah: penskalaan menjadi setengah (horizontal, vertikal atau keduanya) jika tidak mengurangi kualitas terlalu banyak, RLE kode kustom, dan konversi basis untuk mengemas lebih banyak data ke setiap karakter sambil tetap di kisaran ASCII yang dapat dicetak.
sumber
javac -cp cjam-0.6.5.jar Compress.java
, tetapijava -cp cjam-0.6.5.jar Compress
mengatakanError: Could not find or load main class Compress
danjava Compress
tidak menemukan kelas CJam.-cp .:cjam-0.6.5.jar
(di windoze saya pikir Anda memerlukan titik koma bukan titik dua)Python 3.5 (utama dan keluaran) (saat ini tidak bersaing)
Selamat Ulang Tahun, Tantangan! Inilah hadiah Anda: sebuah jawaban!
EDIT: Konversi output ke kode python, meningkatkan tingkat kompresi (sedikit) EDIT2: Membuatnya mencetak mentah saat
size
1. Skor ditingkatkan, tetapi skor perlu dihitung lagi. EDIT3: @Dennis menunjukkan bahwa saya masih memiliki bug untuk diperbaiki, jadi saya menandai jawabannya sebagai tidak bersaingKode:
Jawaban ini bisa menggunakan banyak hal perbaikan, jadi saya mungkin akan mengerjakannya lebih banyak selama akhir pekan.
Bagaimana ini bekerja:
size
.size
dan coba lagi.Algoritma ini bekerja dengan baik untuk kualitas rendah (0,5, 0,6) tetapi tidak bekerja dengan baik pada gambar berkualitas lebih tinggi (sebenarnya mengembang). Ini juga sangat lambat.
Di sini saya memiliki semua file yang dihasilkan, sehingga Anda tidak perlu membuat ulang lagi.
sumber
comping
seharusnyacompimg
), yang saya perbaiki untuk menjalankan program. Kecuali jika saya membuat kesalahan ketika menjalankan kode Anda, dimensi beberapa gambar yang dihasilkan salah (misalnya,image2.txt
memiliki 33.164 byte, tetapiimage2-50.0.txt
memiliki 33.329) dan lainnya tidak menghasilkan file yang sama saat menjalankan program yang dihasilkan (image3-50.0.txt
memiliki kualitas 0,5110 , tetapi menjalankan program yang dihasilkan menghasilkan kualitas 0,4508 ).image3-50.0.py
dari Dropbox Anda dan cocok dengan file yang saya buat.