Randall Munroe (penulis XKCD) mengadakan survei untuk memberi nama pada warna . Hasil utama adalah daftar nama untuk 954 warna monitor RGB yang paling umum .
Untuk kemudahan pemrograman, berikut adalah daftar dalam teks biasa: http://xkcd.com/color/rgb.txt . Hati-hati, baris pertama bukan data, tetapi berisi lisensi.
Tulis program atau fungsi yang mengambil nama warna yang valid dari daftar di atas sebagai input dan output kode warna RGB terkait. Program Anda tidak harus menangani input yang tidak valid dengan cara apa pun yang ditentukan.
Celah standar berlaku. Selain itu, jawaban Anda tidak boleh menggunakan kode warna yang ditentukan sebelumnya (built-in atau eksternal) <-> peta nama warna. (Ini termasuk daftar tertaut.) Kode terpendek dalam byte menang. Jika Anda membaca dari file, jumlah byte file harus disertakan.
Contoh:
dark peach -> #de7e5d
robin's egg blue -> #98eff9
pink/purple -> #ef1de7
shit #7f5f00
-bubble gum pink #ff69af
,bubblegum pink #fe83cc
Jawaban:
Perl 5 -
421239563930407 byte untuk kode dan 3523 untuk file data. Data biner dibaca dari file 'g', hexdump di antaranya dapat ditemukan di sini .
Ini menggunakan fungsi hash sempurna yang dihasilkan menggunakan GNU gperf , yang menetapkan setiap nama warna ke integer unik dalam kisaran 0 hingga 6304 yang dapat digunakan untuk mengindeks tabel. Data gzipped berisi nilai warna dalam format 1 byte yang menunjukkan offset dalam tabel dari warna sebelumnya, lalu 3 byte untuk warna itu sendiri (dengan dua digit hex per byte). (A byte 0 untuk offset berarti sebenarnya nilai berikutnya + 255, karena tidak setiap offset cocok dalam satu byte).
Kode mem-parsing data untuk membuat tabel yang berisi string rgb warna, kemudian menerapkan fungsi hash (diterjemahkan ke perl) ke input untuk memilih output yang cocok dari tabel.
Pemakaian:
Sunting: Lebih lanjut memperkecil ukuran dengan cara gzipping file data
sumber
EXCEL, 18 (+ 18269)
Hanya untuk menetapkan garis dasar, saya akan menunjukkan solusi Excel paling sederhana yang dapat saya pikirkan:
Kode
Kode di Excel sangat sederhana:
Input harus ditempatkan di antara tanda kutip ganda.
Data
Data harus disimpan dalam file .csv, terlihat seperti ini:
Ketika saya mengklik CSV itu secara otomatis membuka excel, dan menempatkan data dalam kolom A dan B, Anda mungkin memerlukan pemisah yang berbeda.
sumber
Ruby,
5,37988 + 9 + 5.220 = 5.317 byte+9 byte untuk
-rdigest
bendera.... ditambah kamus 5.220 byte sebagai data biner yang dibaca dari STDIN (atau argumen nama file). Anda akan menemukan kamus dalam format xxd dalam cuplikan di bawah ini. Program ini menggunakan nama warna sebagai argumen, jadi Anda memanggilnya seperti ini:
Jika ada yang bisa mencari cara yang lebih pendek untuk membaca file dan menggunakan nama warna sebagai argumen, silakan tinggalkan komentar.
$*
(ARGV) dan$<
(ARGF) berinteraksi dengan cara yang aneh dan klenik, ergo$*.pop
.Kamus (format xxd)
Tampilkan cuplikan kode
Penjelasan
Pengkodean kamus
Konstruksi kamusnya sangat sederhana. Saya mengambil hash MD5 heksadesimal dari nama warna dan menggabungkan digit hex kedua hingga keenam (yang kebetulan unik untuk setiap warna) dengan kode warna 6 digit. Saya bergabung dengan ini menjadi string tunggal 10,439 digit hex. Lalu saya mengonversikannya menjadi setara 5.219,5 byte, diisi dengan angka nol di sebelah kanan bahkan 5.220 byte.
Lucunya: Saya mencoba Gzipping kamus dan bahkan
zopfli -i100
menghasilkan file 40 byte lebih besar . Hanya untuk bersenang - senang saya menghitung entropi dari kamus biner dan 99,8% (versus, misalnya,rgb.txt
61,2%). Tidak buruk!Berikut kode yang menghasilkan kamus:
Mengurai kode dan mencari kamus
Ini adalah kebalikan dari hal di atas. Pertama saya mengonversi konversi data biner ke representasi heksadesimal 10.439 digit. Lalu saya mengambil string input (nama warna) dan mendapatkan digit hex kedua hingga keenam dari hash MD5-nya dan menggunakan ekspresi reguler untuk menemukan digit tersebut dalam string hex 10,439 digit pada beberapa indeks yang dapat dibagi dengan 11 dan mengembalikan 6 digit berikutnya , yang merupakan kode warna yang sesuai. Misalnya, untuk hash
b9ca5
( "berawan biru"), ekspresi reguler berikut dibangun:/^.{11}*b9ca5\K.{6}/
. The\K
membuang operator cocok sampai saat itu, jadi hanya enam karakter terakhir dikembalikan.sumber
pink/purple
adalah#a6814c
, tetapi jawaban yang benar adalah#ef1de7
.Perl, 7.375 byte
Menyimpan data yang sedikit terkompresi (
grey
->E
, dll) sebagai data biner terkompresi, memperluasnya menjadi hash dan mengembalikan kunci yang cocok setelah mengganti spasi di input dengan_
. Saya tidak berpikir itu bagus, dan saya yakin orang lain akan memiliki metode yang jauh lebih cerdas untuk mengompresi data, saya mungkin akan bermain dengan ini nanti.Hexdump reversibel tersedia di sini yang dihasilkan menggunakan skrip ini .
Pemakaian
sumber
Ruby,
1213112030 +-p
= 12033 byteHitungan byte adalah setelah mengganti
<compressed text>
dengan data tempel mentah di http://pastebin.com/xQM6EF9Q . (Pastikan Anda mendapatkan data mentah karena tab di dalam file)Saya benar-benar dapat menyusutkan teks lebih jauh tetapi saya sudah melakukannya selama beberapa jam sekarang dan saya perlu tidur.
Input adalah saluran pipa dari STDIN tanpa baris baru. Menambahkan trailing newline membutuhkan +3 byte dengan mengubah
($_+?\t)
ke(chomp+?\t)
.sumber
BASH + bzip2,
805868096797 byteMenyimpan daftar asli ke file setelah mengompresnya, tidak yakin apakah ini diizinkan.
Telepon dengan:
sumber
dusty teal
gagal. Baca semua argumen dengan$*
atau semacamnya.bzgrep ..... c
sebagai gantinyaPython, 9360 karakter
Tidak menggunakan pustaka kompresi apa pun. Saya akan meninggalkannya sebagai sebuah misteri untuk sementara waktu bagaimana cara kerjanya dan kemudian memposting tautan ke teknik tersebut. Tentu saja bisa dibuat lebih pendek dengan menyimpan data dalam format biner tapi itu latihan untuk waktu lain.
Penjelasan:
Menggunakan adaptasi kode dari http://stevehanov.ca/blog/index.php?id=119 untuk menghasilkan pencarian hash minimal yang sempurna dari nama warna ke kode warna.
sumber
Python 3, 4927
182 kode + 4745 file data
Teori Operasi:
md5((67*s).encode('ascii')).digest()[5:7]
adalah hash sempurna dari nama warna ke nilai 2-byte. File data biner hanyalah daftar potongan 5-byte - 2 byte hash dan 3 byte warna. Kode hash nama warna input dan mencari melalui data untuk menemukan kecocokan.Kode untuk menghasilkan file biner:
Inilah kode yang saya gunakan untuk menemukan hash yang sempurna. Tidak ada yang mewah, hanya tiga loop bersarang: jumlah waktu untuk mengulangi nama (misalnya, 'biru', 'blueblue', ...); algoritma hash yang tersedia; dan offset dalam hash. Mencetak kombinasi yang tidak ada tabrakan.
sumber
Python 3, 296 + 3960 = 4256 byte
Saya tidak menggunakan
gperf
, karena itu akan terlalu membosankan untuk hanya mengulangi trik itu. Sebaliknya saya melakukan solusi brute force dari awal dan oleh karena itu ukurannya tidak optimal (tapi tidak terlalu buruk juga).Namun saya menemukan cara mengompres warna lebih efisien - mereka diurutkan dan disejajarkan dengan 4 byte, LZMA kebetulan memanfaatkannya. (warna dikompresi hingga 2180 byte)
Untuk menemukan warna berdasarkan nama, fungsi hash 15-bit digunakan. Secara teoritis dapat ditemukan dengan bit lebih sedikit (angka 0..949 dapat dikodekan dengan 10 bit), tetapi komputer saya tidak dapat menemukan sesuatu yang lebih baik, itu terlalu banyak bekerja.
Kode mengambil input dari stdin dan mencetak jawabannya.
Kode:
File data (biner, harus dinamai
a
dan ditempatkan di folder yang sama):Cara menjalankan:
sumber
C, 19.566 byte
19.566 byte yang menyedihkan.
Standar Bog C. File rgb.txt disalurkan melalui stdin. Warna untuk menemukan diberikan sebagai argumen pertama.
Begitu:
./xkcd "bright sea green" < colors.txt
Memberi:
bright sea green -> #05ffa6
sumber
Java,
7.9787.435 byteKode adalah 293 byte, data 7.142 byte
Golf:
Tidak Disatukan:
File bernama "c" dalam program adalah hasil dari operasi terbalik dari program ini: ambil kode hash dari setiap kunci dalam file input dan simpan dengan representasi integer dari nilai warna. Itu masuk ke aliran output objek, aliran output GZip, kemudian aliran output file. Program ini membacanya melalui aliran input terbalik.
Kode hash Java default dari semua warna adalah unik di set data ini, jadi itu membuat kunci 32 bit yang baik di peta hash. Nilai sudah merupakan bilangan bulat, jadi semua yang perlu dilakukan adalah memformatnya dengan benar sebagai string hex, diisi hingga enam digit jika perlu, dengan tanda pagar di depan.
sumber
Java, 4649 byte
Kode Java: 497 byte, file data: 4152 byte
File tersebut dapat ditemukan di sini
ungolfed:
Program ini menggunakan versi kode Java yang disempurnakan yang hanya menggunakan 17 bit:
Warna diurutkan berdasarkan peningkatan komponen biru. Mereka disimpan di 18 bit: 8 untuk merah, 8 untuk hijau dan 2 untuk delta biru.
Total ukuran file: 949 warna * (18 + 17) = 33 215 = 4152 byte
sumber
JavaScript (Node.js), 10785 byte
Pemakaian:
Data yang dikodekan .
sumber
MATLAB, 94 + 7.243 = 7.337 byte
Hasilkan file MAT "h.mat" dengan variabel "c" yang berisi daftar diurutkan dari checksum CRC32 dari nama-nama (c = java.util.zip.CRC32; c.update (uint8 (x)); c.getValue ();) dan daftar kode heks yang dikonversi diurutkan yang sama (sscanf (x (:, end), '% x')) sebagai "e". Ini harus memiliki (R2013b, v7 Format file, ukuran 7,243 byte.
Fungsinya sebagai berikut
Ini mengambil keuntungan dari kompresi built-in dari file-MAT dan dukungan java untuk fungsi CRC32.
sumber
Pergi, 6709 byte
Kode adalah 404 byte, data adalah 6305 byte
The data dikodekan dengan
xxd -p
. Ekstrak menjadi file yang diberi namaf
denganxxd -r paste f
. Kode dapat dijalankan sebagaigo run file.go "tree green"
sumber
C #, 6422 byte
Kode adalah 575 byte, data 5847 byte
Data ada di file GZipped yang berdekatan yang berisi representasi transformasi dari data asli. Kata-kata berwarna yang muncul lebih dari satu kali diekstraksi dan ditempatkan dalam tabel header di bagian atas file, diawali dengan panjang satu byte.
Entri data (setelah tajuk) terdiri dari serangkaian:
Setiap entri diakhiri dengan 0xFF, 0xFE, 0xFD yang menunjukkan bahwa berikutnya, dua, atau tiga byte berikutnya mewakili masing-masing nilai offset warna.
Tabel diuraikan secara berurutan dan nilai warna diakumulasikan hingga string yang cocok dengan input ditemukan.
Kode Dekompresi / Pencarian yang Diminimalkan:
Kode Kompresi Data
sumber
C # 7,209 byte: 6.643 data byte + 566 kode byte (878 byte tidak diperkecil)
Repo Github ada di sini: https://github.com/nbcarey/color-map
Nama-nama warna dikompres dalam file data menggunakan hash FNV-32-1a karena algoritma hash ini bebas dari tabrakan untuk set nama warna ini. Jadi setiap nama warna disimpan sebagai 4 byte.
Setiap warna disimpan sebagai 3 byte (masing-masing 1 untuk merah, hijau dan biru). Tidak ada keajaiban di sana.
Akibatnya, setiap pemetaan nama warna ke nilai RGV menempati 7 byte dalam file terkompresi.
Ini adalah versi satu-baris dari hash FNV-32-1a (dengan asumsi string yang hanya berisi karakter ASCII sederhana:
File data terkompresi ini ada di repo github di https://github.com/nbcarey/color-map/blob/master/color-map/hashed-color-map.dat
Berikut kode yang diperkecil:
Dan ini kode yang bisa dibaca manusia:
sumber
PHP, 5014 byte
Bukan yang terbaik di sana, tetapi sudah larut dan saya perlu tidur. :-)
Keindahan PHP adalah Anda dapat memasukkan data payload ke dalam skrip Anda dan membaca file itu sendiri, sehingga skrip itu mandiri. Cukup unduh , jalankan dan akan muncul nama warna.
Trik dasar di sini adalah untuk hash nama warna dan menghasilkan substring mengidentifikasi minimal hash itu. Saya menemukan bahwa 4 karakter hash SHA1 sudah cukup, 3 dan 17 pertama untuk secara unik mengidentifikasi semua warna. Kuncinya ada dalam biner serta kode warna, yang nyaman satu byte per saluran warna. Jadi setiap entri membutuhkan 5 byte, yang menghasilkan 5 x 949 = 4745 byte payload (angka ajaib yang Anda lihat dalam kode).
Kompresi tidak banyak membantu, bzip2, LZMA semua membuat file lebih besar sehingga tanpa trik lebih lanjut, ini terkompresi seperti halnya untuk pendekatan ini.
sumber
Bash + (coreutils, gzip, xxd, openssl, sed, grep), 4946 bytes
data: 4482 byte, kode: 464 byte
Data dapat ditemukan di base64 di sini . Saya tahu kode itu mungkin lebih golf. Terlalu mengantuk sekarang: / Ada saran dipersilahkan :-)
Penjelasan
Berikut adalah tindakan yang saya buat pada file asli setelah menghapus komentar lisensi.
openssl dgst -md5 -binary|base64
base64
menggunakan satu set 64 karakter untuk mewakili dataA-Za-z0-9+/
,. Jadi, saya berharap menemukan 2 byte karena semua entri adalah 494 dan 64 * 64 = 4096 tetapi saya tidak dapat menemukannya. Saya juga mencoba menemukan entri unik 2-char dengan menggunakansha512
pada langkah pertama tetapi tidak berhasil. Jadi, saya tinggal dengan 3 byte ini untuk nama warna.(echo '0:';echo -n "$line"|cut -d '#' -f 2)|xxd -rp -l 16|base64
zopfli -i1000
mengompres file.Jadi file hasil sebelum kompresi akan terlihat seperti itu:
Saya mencoba utilitas kompresi lain juga tetapi dengan hasil terburuk kecuali dari
zopfli -i0000 --zlib
dengan 4470 byte danzopfli -i10000 --defalte
dengan 4464 tetapi saya tidak yakin bagaimana untuk mengompres format yang ada.Untuk menemukan kode warna saya melakukan tindakan sebaliknya. Saya membuat kode 3 karakter dari nama yang diberikan dan saya merekonstruksi sebagian kode warna asli. Misalnya untuk
adobe
saya buat semua yang dimulai denganX
:Lalu saya ambil
Xqy
garis dan mengembalikan bagian kedua yang merupakan warna hex.Saya sangat menikmati puzzle ini dan ada banyak jawaban bagus di sini. Terima kasih dan semuanya sudah bekerja dengan baik!
sumber
Bash + coreutils / xxd, 4064 bytes
Data 3796 byte (hex dump file data)
Bash 268 byte
Tidak disatukan
Ide keseluruhan adalah untuk memindai melalui bidang 32-bit, menemukan hash 14-bit unik yang cocok, dan mencetak kode warna di lokasi itu. Pengkodean warna 18-bit memanfaatkan pendekatan Super Chafouin.
Hash 14-bit yang unik dimulai dengan subset dari 14 bit dari 128-bit md5sum. Untuk menemukan bit-bit itu saya menggunakan algoritma genetika yang dikodekan dalam C ++ di sini . Kode pra-memuat file tetap yang disebut "data", yang hanya md5sum, satu per baris, dalam biner. Jika Anda memerlukannya dalam bentuk resep, ini akan membuat file data:
Saya menemukan kandidat terbaik 14 bit (yang telah saya lihat sejauh ini) dari kode ini pada generasi 2, tetapi set ini memiliki dua tabrakan. Khususnya: peta "lumpur" dan "ungu pucat" dengan nilai yang sama, dan peta "aqua blue" dan "hijau muda" dengan nilai yang sama. Karena hanya ada dua tabrakan dan saya belum menemukan sesuatu yang lebih baik, saya hanya mengacaukan mereka; ternyata setengah dari masing-masing nilai bucket ini tidak digunakan.
Saya sudah mencoba kompresi pada d; tetapi bzip2, atau gzip, atau xz tampaknya tidak mengecilkan ukuran d.
sumber
Groovy,
153 + 10.697 = 10.850253 + 9870 = 10.123 byteSaya memutuskan saya menginginkan solusi yang hanya melibatkan satu file, jadi (dengan biaya yang jelas) saya mengkodekan versi data GZIPped CSV ke karakter Unicode 0x0020-0x007E (yang saya kira akan menjadi basis pengkodean 95?). Kode adalah 253 karakter, isi String adalah 10123 karakter.
Agar mudah dibaca, berikut hal yang sama dengan teks yang disandikan dikecualikan:
Solusi asli saya adalah penyandian Basis 64 yang lebih sederhana dengan menggunakan penyandi internal
Agar mudah dibaca, berikut hal yang sama dengan teks yang dikecualikan:
sumber