Jika gambar bernilai 1000 kata, berapa banyak gambar yang bisa Anda masukkan dalam 140 karakter?
Catatan : Itu orang-orang! Tenggat waktu hadiah ada di sini, dan setelah beberapa pertimbangan yang sulit, saya telah memutuskan bahwa entri Boojum nyaris tidak ada di tangan Sam Hocevar . Saya akan memposting catatan yang lebih detail begitu saya punya kesempatan untuk menuliskannya. Tentu saja, setiap orang harus merasa bebas untuk terus mengirimkan solusi dan meningkatkan solusi bagi orang untuk memilih. Terima kasih kepada semua orang yang mengirim dan mengirimkan; Saya menikmati semuanya. Ini sangat menyenangkan bagi saya untuk berlari, dan saya harap ini menyenangkan bagi para pendatang dan penonton.
Saya menemukan posting yang menarik ini tentang mencoba mengompres gambar menjadi komentar Twitter, dan banyak orang di utas itu (dan a utas di Reddit ) memiliki saran tentang berbagai cara yang dapat Anda lakukan untuk melakukannya. Jadi, saya pikir itu akan menjadi tantangan pengkodean yang bagus; biarkan orang menaruh uang mereka di mana mulut mereka berada, dan tunjukkan bagaimana ide-ide mereka tentang penyandian dapat mengarah ke lebih detail dalam ruang terbatas yang Anda miliki.
Saya menantang Anda untuk membuat sistem tujuan umum untuk meng-encode gambar ke dalam 140 karakter pesan Twitter, dan mendekodekannya menjadi gambar lagi. Anda dapat menggunakan karakter Unicode, sehingga Anda mendapatkan lebih dari 8 bit per karakter. Meskipun memungkinkan untuk karakter Unicode, Anda harus memampatkan gambar ke dalam ruang yang sangat kecil; ini tentu akan menjadi kompresi yang hilang, dan karenanya harus ada penilaian subyektif tentang seberapa baik setiap hasil terlihat.
Berikut adalah hasil yang penulis asli, Quasimondo , dapatkan dari penyandiannya (gambar dilisensikan dengan lisensi Creative Commons Attribution-Noncommercial ):
Bisakah kamu berbuat lebih baik?
Aturan
- Program Anda harus memiliki dua mode: encoding dan decoding .
- Saat menyandikan :
- Program Anda harus memasukkan grafik dalam format grafik raster yang masuk akal sesuai pilihan Anda. Kami akan mengatakan bahwa format raster apa pun yang didukung oleh ImageMagick dianggap masuk akal.
- Program Anda harus menampilkan pesan yang dapat direpresentasikan dalam 140 atau kurang poin kode Unicode; 140 kode poin di kisaran
U+0000
-U+10FFFF
, tidak termasuk non-karakter (U+FFFE
,U+FFFF
,U+
nFFFE
,U+
nFFFF
di mana n adalah1
-10
heksadesimal, dan kisaranU+FDD0
-U+FDEF
) dan titik kode pengganti (U+D800
-U+DFFF
). Ini bisa berupa output dalam penyandian yang masuk akal pilihan Anda; setiap penyandian yang didukung oleh GNUiconv
akan dianggap masuk akal, dan penyandian asli platform atau penyandian lokal Anda mungkin akan menjadi pilihan yang baik. Lihat catatan Unicode di bawah ini untuk lebih jelasnya.
- Saat mendekode :
- Program Anda harus mengambil input dari mode encoding Anda .
- Program Anda harus menampilkan gambar dalam format yang masuk akal pilihan Anda, seperti yang didefinisikan di atas, meskipun untuk format vektor keluaran juga OK.
- Output gambar harus merupakan perkiraan gambar input; semakin dekat Anda dengan gambar input, semakin baik.
- Proses decoding mungkin tidak memiliki akses ke output lain dari proses encoding selain output yang ditentukan di atas; artinya, Anda tidak dapat mengunggah gambar di suatu tempat dan mengeluarkan URL untuk proses penguraian kode unduhan, atau hal konyol lainnya.
Demi konsistensi dalam antarmuka pengguna, program Anda harus berperilaku sebagai berikut:
- Program Anda harus berupa skrip yang dapat diatur agar dapat dieksekusi pada platform dengan interpreter yang sesuai, atau program yang dapat dikompilasi menjadi executable.
- Program Anda harus mengambil sebagai argumen pertama
encode
ataudecode
untuk mengatur mode. Program Anda harus mengambil input dalam satu atau lebih cara berikut (jika Anda menerapkan yang mengambil nama file, Anda juga dapat membaca dan menulis dari stdin dan stdout jika nama file hilang):
Ambil input dari standar masuk dan hasilkan standar keluar.
my-program encode <input.png >output.txt my-program decode <output.txt >output.png
Ambil input dari file yang disebutkan di argumen kedua, dan hasilkan output di file yang disebutkan di argumen ketiga.
my-program encode input.png output.txt my-program decode output.txt output.png
- Untuk solusi Anda, silakan kirim:
- Kode Anda, secara penuh, dan / atau tautan yang dihosting di tempat lain (jika sangat panjang, atau membutuhkan banyak file untuk dikompilasi, atau sesuatu).
- Penjelasan tentang cara kerjanya, jika tidak segera jelas dari kode atau jika kode panjang dan orang akan tertarik pada ringkasan.
- Contoh gambar, dengan gambar asli, teks yang dikompres ke bawah, dan gambar yang diterjemahkan.
- Jika Anda membangun ide yang dimiliki orang lain, mohon cantumkan. Tidak masalah untuk mencoba melakukan penyempurnaan terhadap ide orang lain, tetapi Anda harus mengaitkannya.
Pedoman
Ini pada dasarnya adalah aturan yang dapat dilanggar, saran, atau kriteria penilaian:
- Estetika itu penting. Saya akan menilai, dan menyarankan agar orang lain menilai, berdasarkan:
- Seberapa baik gambar output terlihat, dan seberapa mirip gambar aslinya.
- Alangkah bagusnya teks itu. Buku gobbledigook yang benar-benar acak tidak masalah jika Anda memiliki skema kompresi yang sangat pintar, tetapi saya juga ingin melihat jawaban yang mengubah gambar menjadi puisi mutli-bahasa, atau sesuatu yang pintar seperti itu. Perhatikan bahwa pembuat solusi asli memutuskan untuk hanya menggunakan karakter Cina, karena terlihat lebih bagus.
- Kode yang menarik dan algoritme pintar selalu bagus. Saya suka pendek, to the point, dan kode yang jelas, tetapi algoritma rumit benar-benar pintar juga OK selama mereka menghasilkan hasil yang baik.
- Kecepatan juga penting, meskipun tidak sepenting seberapa baik pekerjaan mengompres gambar yang Anda lakukan. Saya lebih suka memiliki program yang dapat mengkonversi gambar dalam sepersepuluh detik dari sesuatu yang akan menjalankan algoritma genetika selama berhari-hari.
- Saya lebih suka solusi yang lebih pendek daripada yang lebih lama, asalkan kualitasnya sebanding; keringkasan adalah suatu kebajikan.
- Program Anda harus diimplementasikan dalam bahasa yang memiliki implementasi yang tersedia secara bebas di Mac OS X, Linux, atau Windows. Saya ingin dapat menjalankan program, tetapi jika Anda memiliki solusi hebat yang hanya berjalan di bawah MATLAB atau sesuatu, itu tidak masalah.
- Program Anda harus bersifat umum; itu harus bekerja untuk sebanyak mungkin gambar yang berbeda, meskipun beberapa mungkin menghasilkan hasil yang lebih baik daripada yang lain. Khususnya:
- Memiliki beberapa gambar yang dibangun ke dalam program yang cocok dan menulis referensi, dan kemudian menghasilkan gambar yang cocok saat decoding, cukup timpang dan hanya akan mencakup beberapa gambar.
- Suatu program yang dapat mengambil gambar bentuk sederhana, datar, geometris dan menguraikannya menjadi beberapa vektor primitif cukup bagus, tetapi jika gagal pada gambar di luar kompleksitas tertentu mungkin itu tidak cukup umum.
- Program yang hanya dapat mengambil gambar dengan rasio aspek tetap tertentu tetapi melakukan pekerjaan dengan baik juga akan baik-baik saja, tetapi tidak ideal.
- Anda mungkin menemukan bahwa gambar hitam dan putih dapat memperoleh lebih banyak informasi ke dalam ruang yang lebih kecil daripada gambar berwarna. Di sisi lain, itu dapat membatasi jenis gambar yang dapat diterapkan; wajah menjadi hitam dan putih, tetapi desain abstrak mungkin tidak berjalan dengan baik.
- Tidak apa-apa jika gambar output lebih kecil dari input, sementara proporsi yang kira-kira sama. Tidak apa-apa jika Anda harus memperbesar gambar untuk membandingkannya dengan aslinya; yang penting adalah tampilannya.
- Program Anda harus menghasilkan output yang benar-benar bisa melalui Twitter dan keluar tanpa cedera. Ini hanya panduan daripada aturan, karena saya tidak dapat menemukan dokumentasi tentang set karakter yang didukung, tetapi Anda mungkin harus menghindari karakter kontrol, karakter menggabungkan yang funky yang tak terlihat, karakter penggunaan pribadi, dan sejenisnya.
Rubrik penilaian
Sebagai panduan umum tentang bagaimana saya akan menentukan peringkat solusi ketika memilih solusi yang saya terima, katakanlah saya mungkin akan mengevaluasi solusi pada skala 25 poin (ini sangat kasar, dan saya tidak akan mencetak apa pun secara langsung, hanya menggunakan ini sebagai pedoman dasar):
- 15 poin untuk seberapa baik skema pengkodean mereproduksi berbagai macam gambar input. Ini adalah penilaian subyektif dan estetis
- 0 berarti itu tidak berfungsi sama sekali, itu memberikan gambar yang sama kembali setiap kali, atau sesuatu
- 5 berarti ia dapat meng-enkode beberapa gambar, meskipun versi yang didekodekannya terlihat jelek dan mungkin tidak bekerja sama sekali pada gambar yang lebih rumit
- 10 berarti bahwa ia bekerja pada berbagai gambar, dan menghasilkan gambar tampak menyenangkan yang kadang-kadang dapat dibedakan
- 15 berarti bahwa itu menghasilkan replika sempurna dari beberapa gambar, dan bahkan untuk gambar yang lebih besar dan lebih kompleks, memberikan sesuatu yang dapat dikenali. Atau, mungkin itu tidak membuat gambar yang cukup dikenali, tetapi menghasilkan gambar yang indah yang jelas berasal dari aslinya.
- 3 poin untuk penggunaan cerdas dari rangkaian karakter Unicode
- 0 poin untuk hanya menggunakan seluruh rangkaian karakter yang diizinkan
- 1 poin untuk menggunakan serangkaian karakter terbatas yang aman untuk ditransfer melalui Twitter atau dalam berbagai situasi yang lebih luas
- 2 poin untuk menggunakan subset karakter tematik, seperti hanya Han ideograf atau hanya karakter kanan-ke-kiri
- 3 poin untuk melakukan sesuatu yang sangat rapi, seperti menghasilkan teks yang dapat dibaca atau menggunakan karakter yang terlihat seperti gambar yang dimaksud
- 3 poin untuk pendekatan algoritmik cerdas dan gaya kode
- 0 poin untuk sesuatu yang 1000 baris kode hanya untuk memperkecil gambar, perlakukan sebagai 1 bit per piksel, dan base64 mengkodekan itu
- 1 poin untuk sesuatu yang menggunakan teknik pengkodean standar dan ditulis dengan baik dan singkat
- 2 poin untuk sesuatu yang memperkenalkan teknik pengodean yang relatif baru, atau yang mengejutkan pendek dan bersih
- 3 poin untuk satu liner yang benar-benar menghasilkan hasil yang baik, atau sesuatu yang membuka jalan baru dalam penyandian grafis (jika ini seperti jumlah poin yang rendah untuk menerobos landasan baru, ingatlah bahwa hasil yang baik ini kemungkinan akan memiliki skor tinggi untuk estetika demikian juga)
- 2 poin untuk kecepatan. Semuanya sama, lebih cepat lebih baik, tetapi kriteria di atas lebih penting daripada kecepatan
- 1 poin untuk berjalan pada perangkat lunak bebas (open source), karena saya lebih suka perangkat lunak gratis (perhatikan bahwa C # akan tetap memenuhi syarat untuk titik ini selama ini berjalan pada Mono, demikian juga kode MATLAB akan memenuhi syarat jika berjalan pada GNU Octave)
- 1 poin untuk benar-benar mengikuti semua aturan. Aturan-aturan ini menjadi agak besar dan rumit, jadi saya mungkin akan menerima jawaban yang baik jika tidak salah detail kecil, tapi saya akan memberikan poin tambahan untuk solusi yang benar-benar mengikuti semua aturan
Gambar referensi
Beberapa orang telah meminta beberapa gambar referensi. Berikut adalah beberapa gambar referensi yang dapat Anda coba; versi yang lebih kecil tertanam di sini, semuanya terhubung ke versi gambar yang lebih besar jika Anda membutuhkannya:
Hadiah
Saya menawarkan hadiah 500 rep (ditambah 50 yang ditendang oleh StackOverflow) untuk solusi yang saya sukai, berdasarkan kriteria di atas. Tentu saja, saya mendorong semua orang untuk memilih solusi favorit mereka di sini juga.
Perhatikan tenggat waktu
Kontes ini akan berlangsung hingga hadiah habis, sekitar jam 6 sore pada hari Sabtu, 30 Mei. Saya tidak dapat mengatakan waktu pasti akan berakhir; mungkin berkisar antara 5 hingga 7 malam. Saya akan menjamin bahwa saya akan melihat semua entri yang dikirimkan pada pukul 14:00, dan saya akan melakukan yang terbaik untuk melihat semua entri yang diserahkan pada pukul 16:00; jika solusi diajukan setelah itu, saya mungkin tidak memiliki kesempatan untuk memberi mereka pandangan yang adil sebelum saya harus membuat keputusan. Selain itu, semakin awal Anda mengirim, semakin banyak peluang yang Anda miliki untuk memberikan suara untuk dapat membantu saya memilih solusi terbaik, jadi cobalah dan kirimkan lebih awal daripada tepat di tenggat waktu.
Catatan Unicode
Ada juga beberapa kebingungan tentang apa yang diperbolehkan oleh karakter Unicode. Kisaran poin kode Unicode yang mungkin adalah U+0000
untuk U+10FFFF
. Ada beberapa titik kode yang tidak pernah valid untuk digunakan sebagai karakter Unicode dalam pertukaran data apa pun yang terbuka; ini adalah karakter noncharacters dan kode pengganti . Noncharacters didefinisikan dalam Unidode Standard 5.1.0 bagian 16,7 sebagai nilai-nilai U+FFFE
, U+FFFF
, U+
nFFFE
, U+
nFFFF
di mana n adalah 1
- 10
heksadesimal, dan kisaran U+FDD0
-U+FDEF
. Nilai-nilai ini dimaksudkan untuk digunakan untuk penggunaan internal spesifik aplikasi, dan aplikasi yang sesuai dapat menghapus karakter ini dari teks yang diproses oleh mereka. Poin pengganti kode, didefinisikan dalam Unicode Standard 5.1.0 bagian 3.8 sebagai U+D800
- U+DFFF
, digunakan untuk pengkodean karakter di luar Basic Multilingual Plane di UTF-16; dengan demikian, tidak mungkin untuk mewakili titik-titik kode ini secara langsung dalam pengkodean UTF-16, dan tidak sah untuk menyandikannya dalam pengkodean lainnya. Dengan demikian, untuk tujuan kontes ini, saya akan mengizinkan program apa pun yang menyandikan gambar ke dalam urutan yang tidak lebih dari 140 titik kode Unicode dari rentang U+0000
- U+10FFFF
, tidak termasuk semua noncharacters dan pasangan pengganti sebagaimana didefinisikan di atas.
Saya akan lebih suka solusi yang hanya menggunakan karakter yang ditugaskan, dan bahkan yang lebih baik yang menggunakan himpunan bagian cerdas dari karakter yang ditugaskan atau melakukan sesuatu yang menarik dengan set karakter yang mereka gunakan. Untuk daftar karakter yang ditugaskan, lihat Database Karakter Unicode ; perhatikan bahwa beberapa karakter dicantumkan secara langsung, sementara beberapa terdaftar hanya sebagai awal dan akhir suatu rentang. Juga perhatikan bahwa poin kode pengganti tercantum dalam database, tetapi dilarang seperti yang disebutkan di atas. Jika Anda ingin memanfaatkan properti karakter tertentu untuk membuat teks yang Anda hasilkan lebih menarik, ada berbagai database informasi karakter yang tersedia, seperti daftar blok kode bernama dan berbagai properti karakter.
Karena Twitter tidak menentukan set karakter yang tepat yang mereka dukung, saya akan menerima solusi yang tidak benar-benar bekerja dengan Twitter karena karakter tertentu menghitung ekstra atau karakter tertentu dilucuti. Lebih disukai tetapi tidak diharuskan bahwa semua keluaran yang disandikan harus dapat ditransfer tanpa cedera melalui Twitter atau layanan microblogging lainnya seperti identi.ca . Saya telah melihat beberapa dokumentasi yang menyatakan bahwa entitas Twitter mengkodekan <,>, dan &, dan dengan demikian menghitungnya masing-masing 4, 4, dan 5 karakter, tetapi saya belum menguji itu sendiri, dan penghitung karakter JavaScript mereka tampaknya tidak terlihat. untuk menghitungnya seperti itu.
Kiat & Tautan
- Definisi karakter Unicode yang valid dalam aturan agak rumit. Memilih satu blok karakter, seperti CJK Unified Ideographs (U + 4E00 – U + 9FCF) mungkin lebih mudah.
- Anda dapat menggunakan pustaka gambar yang ada, seperti ImageMagick atau Python Imaging Library , untuk manipulasi gambar Anda.
- Jika Anda memerlukan bantuan untuk memahami rangkaian karakter Unicode dan beragam penyandiannya, lihat panduan cepat ini atau FAQ terperinci tentang UTF-8 di Linux dan Unix .
- Semakin awal Anda mendapatkan solusi, semakin banyak waktu saya (dan orang lain memberikan suara) harus melihatnya. Anda dapat mengedit solusi Anda jika Anda memperbaikinya; Saya akan mendasarkan karunia saya pada versi terbaru ketika saya melihat solusi terakhir saya.
- Jika Anda ingin format gambar yang mudah diurai dan ditulis (dan tidak ingin hanya menggunakan format yang sudah ada), saya sarankan menggunakan format PPM . Ini adalah format berbasis teks yang sangat mudah digunakan, dan Anda dapat menggunakan ImageMagick untuk mengonversi dari dan ke sana.