Tantangan golf adalah menyandikan dan mengompres gambar berikut di dalam file sumber.
Untuk melakukan ini, Anda perlu menulis 3 fungsi: red
,, green
dan blue
yang menerima koordinat x / y gambar dan mengembalikan nilai piksel R / G / B yang sesuai antara 0-255.
Berikut adalah kode uji C / C ++:
#include <stdio.h>
#include "your_file"
int main() {
int x, y;
for(y = 0; y < 32; ++y)
for(x = 0; x < 32; ++x)
printf("%i %i %i\n", red(x, y), blue(x, y), green(x, y));
}
Dan hasilnya: http://pastebin.com/A770ckxL (Anda dapat menggunakan ini untuk menghasilkan data gambar Anda)
Aturan & detail:
- Ini golf
- Hanya kode / file Anda yang di-golf - kode tes terpisah
- Set karakter yang digunakan adalah ASCII, namun karakter kontrol dalam string hanya dapat digunakan jika lolos (seperti '\ n' dan '\ r', dll.)
- Semuanya harus terkandung di dalam sumbernya - tanpa memuat file
- Output Anda harus sesuai dengan contoh output. Ini berarti kompresi tanpa kehilangan.
Bahasa:
Masalahnya ditulis dengan C / C ++ dalam pikiran, tapi saya menghapus pembatasan itu. Dengan itu, saya masih akan merekomendasikan menggunakannya.
Jawaban:
C,
796 754 712 703 692 685 682 670 666 662 656648 karakterChangelog:
return
ke#define
, digantiif
dengan?
pernyataan (terima kasih @FUZxxl), hapusint
dari daftar parameter fungsi.#define
p[]
danh[]
, beberapa?:
peningkatan lagib
jadii
tidak diperlukan lagi.m=b
bukannyam=11
dann<2e3
bukannyai<356
- ini dekat dengan perilaku / memori rusak, tetapi sepertinya saya beruntung :)k
sekarang (32,16,8,4,2,1,0) bukannya (5,4,3,2,1,0). Gotcha, DC;)p[]
danh[]
, dikonversih[]
menjadichar*
- awwww, ada kucing mengantuk di dalamnya^<+_=>-
while
=>for
,l=l*2+...
=>l+=l+...
m=m>9?...
=>c[n++]=m>9?...
b[]
, jadi kita dapat memetakan ke 64-127 alih-alih 0-63 dan tidak perlu indeks bitk
lagi. Terima kasih @Piotr Tarsa . Diganti?:
(ekstensi GCC) dengan||
. Terima kasih @JamesBp[]
)Gambar dikonversi ke string seperti Base64 (ASCII 37-100), menggunakan huffman coding untuk mengkodekan warna 0-9 menggunakan 3-6 bit dan warna khusus 10 (pixel sama seperti sebelumnya) menggunakan hanya 1 bit.
Disalin dua hal dari jawaban bunnit, para
#define
dan seluruh gambar yang diterjemahkan sepenuhnya setiap kalired
/green
/blue
disebut. Ada beberapa ruang untuk perbaikan tambahan, jadi harapkan beberapa pembaruan :) Saya tidak yakin tentang kepatuhan kode, menggunakan GCC 4.6.1 untuk mengkompilasi dan menguji.Dari segi kompresi, saya pikir pengkodean aritmatika akan membantu karena distribusinya cukup miring, tapi mungkin kode overhead akan terlalu berat dalam kasus ini. LZW juga harus melakukan pekerjaan dengan sangat baik. Warna cukup lokal, jadi pengkodean adaptif mungkin merupakan ide.
754 versi karakter yang lebih mudah dibaca dengan beberapa komentar:
sumber
int
dari daftar parameter untuk menghapus beberapa byte lagi.m=m>9?c[n-1]:m;
untukif(m>9)m=c[n-1];
?if(k<0){j=b[i++]-37;k=5;}
mengapa tidakk>=0?:(j=b[i++]-37,k=5);
? (Kode ini menggunakan ekstensi C dari gcc,x=a?:b
sama denganx=a?a:b
, dengan perbedaan bahwa a hanya dievaluasi sekali.red(x,y){while(i<356){--k>=0?:(j=b[i++]-37,k=5);l*=2;if(j&(1<<k))l++;for(m=0;m<11;m++)l!=h[m]?:(m=m<=9?:c[n-1],c[n++]=m,l=0,m=12);}return P;}
Python (
684592 karakter)Karena tantangan ini sekarang terbuka untuk semua, mengapa tidak! Ini adalah rute penyandian zlib -> base64 yang sudah dikenal, jadi saya minta maaf untuk itu. Semoga entri dengan sedikit kecerdikan akan lebih pendek!
Berikut cuplikan uji yang dianalogikan dengan aslinya:
sumber
C ++, 631 karakter; C - 613
Coder mtf unary base-92, C ++, 631 karakter:
Dan versi C di atas (613 karakter):
Hanya untuk memasukkan entri dengan basis-95 data dan kode aritmatika + model statistik adaptif.
kode schnaader menggunakan ~ 438 karakter untuk data, dan hanya milikku 318 (311 tanpa topeng).
Tapi seperti yang diharapkan, pengkodean aritmatika terlalu rumit untuk sampel kecil seperti ini.
(Ini adalah 844 karakter)
Pengujian (dari versi base-96 sebelumnya):
http://codepad.org/qrwuV3Oy
http://ideone.com/ATngC
Entah bagaimana SO makan kode 7F, jadi saya harus memperbaruinya ke base = 95
sumber
C ++ -
15251004964 karakterMembuat array z yang menyimpan semua warna yang mungkin sebagai bilangan bulat tunggal. (R << 16 | g << 8 | b). Membuat array d yang menyimpan {jumlah, nilai}, nilainya adalah posisi dalam array z, jumlahnya adalah jumlah piksel berturut-turut dengan nilai itu. (Yaitu 3,0, berarti colout t [0] muncul 3 berikutnya piksel. Array sebenarnya dari piksel (c) kemudian dihitung setiap kali merah disebut. Nilai dalam array kemudian bergeser ke kanan dan ANDed sesuai kebutuhan untuk mendapatkan komponen yang benar.
Saya mungkin bisa menyimpan beberapa karakter lagi (~ 50) dengan mengambil lebih banyak pola dari array sebagai definisi.Sunting 1 - mengubah array d untuk array char dengan masing-masing nilai diimbangi oleh 48, yang berarti saya dapat menggambarkannya sebagai string yang menyimpan beban koma.
Sunting 2 - Mengambil sebagian besar fungsi di dalam pernyataan define.
sumber
int
(jadiint f(int x,int y)
menjadif(x,y)
.Javascript,
696694 karakterTerima kasih kepada schnaader untuk 696 -> 694.
Saya menemukan format pengodean yang berbeda, yang pada dasarnya adalah pengodean Run-length dengan tabel pencarian warna. Ini bekerja cukup baik, karena ada kurang dari 16 warna dan mereka muncul kurang dari 16 kali berturut-turut; jadi setiap definisi piksel termasuk panjang cocok menjadi satu byte. Saya menempatkan warna di bagian tinggi byte dan hitungan di bagian rendah.
Pada akhirnya, string base64 ternyata lebih panjang dari yang saya duga (472 karakter), tetapi program penguraiannya sangat singkat.
Catatan: Saya membagi kode untuk memiliki sedikit keterbacaan. Perlu berada di satu baris untuk menjalankan.
Kode uji:
Saya pikir contoh hasil sebenarnya adalah output dari merah, hijau, biru (bukan merah, biru, hijau seperti dalam kode tes asli); tetap bekerja untuk saya seperti itu.
sumber
[0,16354410,4671418,6379596,7783255,5295994,5390379,3435360,9975021,5131894]
- ini menghemat 1 karakter dan merupakan urutan GBR bukan RGB.C ++, 1357 karakter
Deobfuscated sedikit:
C
berisi nilai RGB untuk sepuluh warna gambar yang berbeda.E
berisi data untuk gambar, di mana setiap elemenE[i]
mengkodekan hitungan ulangE[i]/10
dan indeks warnaE[i]%10
.sumber
int red(x,y){R Q(x+32*y)[0]}(only
# define`return
), maka Anda mungkin dapat mencukur lebih banyak karakter.Python 3 (589 karakter)
Kode uji
Berdasarkan solusi dari Dillon Cower
sumber
PHP (5.4) - 822
Saya sudah melakukan ini dengan sengaja tidak menggunakan salah satu fungsi built-in kompresi . Solusi ini belum selesai, saya tidak yakin jika saya sudah menyerah, saya dapat melihat area untuk perbaikan tetapi saya tidak dapat menemukan waktu / kemauan untuk memperbaiki semuanya saat ini, jadi saya memposting apa yang saya miliki sejauh ini.
Baris baru + komentar akan dihapus untuk 822 byte.
Tes rintisan:
Kompresi data gambar itu sendiri cukup bagus, tetapi fungsi untuk mengambil nilai RGB membutuhkan 1/4 kode.
Saya menggunakan mekanisme encoding panjang base70 + run kustom.
Data gambar yang disandikan referensi indeks array dari RLE, yang pada gilirannya indeks array warna. Saya tidak yakin berapa banyak overhead ini menambah atau mengurangi secara langsung referensi warna.
Karena ada 10 warna (0 hingga 9), RLE disimpan sebagai
run_length * 10 + colour_index
. Memberikan serangkaian penyandian antara 10 dan 145 tanpa bereksperimen dengan optimisasi berdasarkan pemesanan warna. (yaitu saya dapat membuat kisaran 19 hingga 140 dengan memindahkan warna 0 hingga 5, 5 hingga 9, dan 9 hingga 0 - tetapi ini mungkin memiliki efek ketukan lainnya)Jawaban sebelumnya menyatakan data yang dikodekan adalah 472 byte. Data gambar saya yang disandikan adalah 352 byte, tetapi RLE / peta warna menengah (yang bukan disandikan biner) adalah 129 byte lebih lanjut, sehingga totalnya adalah 481. (serta overhead tambahan untuk menggabungkan keduanya). Namun saya menduga metode saya mungkin skala yang lebih baik untuk gambar yang lebih besar.
MELAKUKAN:
global
adalah menyebalkan, tetapi tidak dapat mengakses indeks karakter pada konstanta.sumber
C (gcc) , 602 byte
Cobalah online!
Kehabisan
sumber