Setelah menghabiskan beberapa saat di Stack Exchange, saya dapat mengenali sebagian besar situs di Hot Network Pertanyaan dengan ikon kecil mereka (yang juga merupakan favicon mereka ), tetapi tentu saja tidak semuanya. Mari kita menulis sebuah program yang bisa! Anda harus menulis kode yang menentukan situs, dengan salah satu dari 132 favicon (saat ini), termasuk Stack Overflow dalam bahasa Jepang (yang masih dalam versi beta pribadi):
Saya telah mengunggah file ZIP dengan semua gambar ini sebagai PNG di GitHub . Klik tombol "Raw" untuk mengunduhnya. Urutan ikon di atas adalah urutan abjad dari nama file di zip.
Nama situs yang sesuai (dalam urutan ini) adalah:
Catatan:
- Saya telah menghapus
®
dariLEGO® Answers
danExpressionEngine® Answers
, jadi Anda tidak perlu khawatir tentang Unicode. - Saya menggunakan nama Inggris untuk Stack Overflows dalam bahasa Jepang dan Portugis untuk alasan yang sama.
- Ikon Ilmu Bumi dan Bahasa Spanyol tidak bisa dibedakan. Oleh karena itu, mengingat salah satu ikon ini, kode Anda dapat mengembalikan salah satu dari situs tersebut (sesuai pilihan Anda). Hal yang sama berlaku untuk Magento dan Seni Bela Diri .
Aturan
Anda dapat menulis program atau fungsi yang
- menerima nama file gambar (lokal) melalui STDIN, argumen baris perintah atau argumen fungsi atau menerima konten file gambar melalui STDIN
- mengembalikan atau mencetak ke STDOUT nama situs, seperti yang tercantum di atas.
Kode Anda harus mengenali semua 132 situs dengan benar (dengan pengecualian yang disebutkan di atas).
Anda tidak boleh membuat asumsi apa pun tentang nama file (seperti itu namanya codegolf.png
). Anda dapat berasumsi bahwa gambar tersebut memiliki dimensi 16x16, dan itu memang akan menjadi salah satu dari 132 gambar di atas. Gambar di atas adalah semua PNG, tetapi Anda dapat menggunakan format grafik raster yang nyaman lainnya, tetapi Anda harus mengonversi gambarnya sendiri. Anda tidak boleh membuat asumsi apa pun tentang aliran byte sebenarnya dari file gambar, selain itu itu adalah gambar yang valid dalam format apa pun yang Anda pilih. Khususnya, jika ada beberapa cara untuk menyandikan gambar yang sama dalam format Anda (misalnya dengan menambahkan bidang yang tidak relevan ke bagian tajuk), kode Anda harus berfungsi untuk semuanya. Singkatnya, kode Anda seharusnya hanya mengandalkan nilai pixel itu sendiri, tidak ada detail file yang menyandikannya.
Seperti biasa, Anda tidak boleh mengambil data apa pun dari internet. Anda harus menentukan situs dari gambar saja.
Anda dapat menggunakan fungsi internal atau pihak ketiga untuk membaca file gambar dan mendapatkan daftar nilai warna, tetapi Anda tidak boleh menggunakan fungsi pemrosesan gambar lain yang ada.
Ini adalah kode golf, jadi jawaban tersingkat (dalam byte) menang.
sumber
pngcrush
tidak tidak akan ada.Jawaban:
Python 3.x + Bantal,
230118941878 byteIdenya adalah memotong gambar dan menemukan string yang sesuai dari kamus (sama seperti jawaban lainnya).
Kode kuncinya adalah ini:
Kami membuka file, dan kemudian mengubahnya menjadi string nilai RGBA 1024-byte. Dengan sedikit eksperimen, kami menemukan bahwa checksum ADLER-32 dari setiap byte keenam dari string byte ini unik untuk 132 gambar ini. Dan kemudian pengujian lebih lanjut menunjukkan bahwa, mengambil modulus 2003 dari checksum memberikan kamus terkecil.
Kamus aslinya terlihat seperti:
Kami perhatikan bahwa semua nama situs tidak mengandung angka. Karenanya kita dapat menggabungkan seluruh kamus menjadi satu string:
Dan kemudian gunakan misalnya regex
1969(\D+)
untuk mengekstrak nama situs. String besar ini kemudian dikompres untuk menghemat ruang (biarkan mesin kompresi memperhatikan beberapa kemunculan "Bahasa"), dan akhirnya base-85 dikodekan.Karena sekarang ini juga ditandai sebagai kompleksitas-kolmogorov , di sini solusi 2394-byte yang tidak menggunakan kompresi (zlib masih diimpor untuk adler32).
sumber
.tobytes()
mendapatkan data piksel (16 × 16 × 4 = 1024), jadi itu bergantung pada gambar. File harus dalam RGBA.C #, 2760 byte
Solusi saya tidak menggunakan hashing, itu benar-benar memeriksa masing-masing piksel gambar dan memutuskan berdasarkan itu. Saya menemukan bahwa itu sudah cukup untuk memeriksa komponen biru dari modulo gambar 9. Idenya adalah untuk membagi berulang kali berdasarkan nilai pixel.B% 9, seperti:
Menggunakan skrip, saya membuat program mengerikan berikut (5197 bytes) yang memecahkan masalah menggunakan pohon keputusan biner:
Beberapa orang telah menggunakan fungsi kompresi bawaan dalam solusi mereka. Saya membuat sendiri, menulis naskah yang mengidentifikasi substring umum dan menggantinya dengan steno karakter tunggal. Kode dikompresi ke string by-by 2502 berikut:
Kamus yang diperlukan untuk dekompresi hanya 108 byte:
Kamus menggunakan titik koma sebagai pembatas, dan berisi karakter tunggal diikuti oleh dekompresi mereka. Jadi untuk mendekompres, ":" pertama-tama akan diganti dengan "&", lalu "<" oleh "%!", "|" oleh "ic", dan sebagainya. Dekompresi string c dapat diekspresikan dengan cara yang cukup ringkas:
Kemudian, setelah dekompresi saya menggunakan beberapa refleksi ilmu hitam untuk mengkompilasi kode dengan cepat dan menjalankannya:
Perhatikan bahwa contoh yang digunakan di sini untuk penjelasan sedikit berbeda dari yang digunakan dalam solusi 2876 byte.
sumber
Node.js,
3178313026672608 BytesMenghitung hash SHA1 dari setiap data gambar file dan menggunakan byte 16 hingga 19 dari hex digest, mengindeks nama-nama situs.
Menggunakan byte 12 hingga 16 dari hex digest masing-masing hash SHA1 file, mengindeks nama-nama situs. Mungkin ada kombinasi yang lebih pendek menggunakan hanya 3 byte dari intisari hex.sumber
h="17352368".match(/.{4}/g)
(hash 4 karakter, pisah menjadi array),s="MathOverflow;StackOverflow in Portuguese".split(";")
(nama dipisahkan oleh;) dan kemudian kumpulkan semuanya:t={}h.forEach(function(k,i){t[k]=s[i]})
(menghasilkan objek yang sama dengan kode Anda). Ada 132 titik koma, jadi bahkan jika Anda beralih ke karakter 2-byte (OP mengatakan seharusnya tidak ada unicode dalam nama situs), Anda akan menghemat ruang. Anda juga dapat menambahkan optimasi @ manatwork di atas penghematan tambahan itu.split()
s: us string tunggal seperti "1234Site; 5678Other". Kemudian, seandainya tidak akan ada bentrokan antara fragmen hash dan nama situs, satumatch()
akan melakukannya:function $(e){r=require;return"8d4fAcademia;3a6dAndroid Enthusiasts;5caeAnime & Manga;804cAsk Different;bef3Arduino".match(r("crypto").createHash("sha1").update(r("fs").readFileSync(e)).digest("hex").slice(12,16)+"([^;]+)")[1]}
Python 2.7,
19061889 byteSolusi ini menggunakan CRC32 pada data piksel untuk membuat pengidentifikasi basis 2 digit yang unik. Indeks pengidentifikasi kemudian digunakan untuk mencari string jawaban.
Bagian yang sulit adalah menemukan kombinasi fungsi hash-style yang akan menghasilkan 132 (atau 131) label kecil tapi unik. Saya mencoba beberapa opsi sebelum memutuskan yang ini. Sepertinya cukup kompak.
Program ini menggunakan Python PIL untuk membaca data piksel dari file.
Python 2.7 2150 byte
Ini adalah versi tanpa menggunakan kompresi atau pengkodean pustaka. Daftar Stack Exchange dikompresi dengan metode pertukaran sederhana. Karakter yang tidak digunakan dalam teks:
digunakan untuk memegang segmen string umum. Teks tidak dikompresi dengan
for k,v in [(v[0],v[1:]) for v in K.split('|')]:T=T.replace(k,v)
garis. Tabel pengindeksan dua karakter sama seperti pada program di atas.sumber
C #, 2672 byte
Tabel (string) label dan hash SHA parsial dikompresi untuk menghemat beberapa byte. Kamus aslinya terlihat seperti:
sumber
var
harus menyimpan beberapa byte. 2) Ada apa dengan pembuat string? Saya tidak melihatnya digunakan. 3)StreamReader.ReadToEnd
mungkin sedikit membantu juga.