Tugas Anda adalah membuat program yang akan, diberi gambar input, membuat gambar output dengan ukuran yang sama, di mana semua piksel disusun berdasarkan nilai hex.
Program Anda dapat:
- Urutkan piksel dari kiri ke kanan lalu ke bawah atau pertama-tama mengurutkan dalam kolom dan kemudian ke kanan. Bagaimanapun, pixel kiri atas adalah yang terkecil, dan kanan bawah adalah yang terbesar.
- Gunakan transparansi, tetapi ini tidak diperlukan.
- Urutkan berdasarkan RGB, tetapi Anda dapat menggunakan CMY, atau format lain dengan setidaknya 3 nilai. Anda dapat memilih nilai untuk disortir. (HSV dapat memberikan beberapa gambar yang bagus)
- Gunakan format gambar terkenal apa saja yang dapat dibuka oleh kebanyakan komputer.
Aturan:
- Keluaran harus ditulis ke disk atau dapat dikirimkan ke file.
- Input diberikan sebagai argumen commandline, dalam bentuk jalur relatif ke gambar, atau disalurkan dari commandline.
- Ini kode golf, jadi kode terpendek dalam byte menang!
Jawaban:
Pyth - 10 byte
Membaca gambar, menciutkan bitmap, mengurutkan, dan kemudian membagi bitmap lagi, lalu menulis.
Tidak bekerja online karena alasan yang jelas. Mengambil input sebagai jalur relatif ke file gambar dan menghasilkan
o.png
.Output dari American Gothic:
sumber
JavaScript (ES6),
383377354 byteDemo yang dapat dijalankan:
Tampilkan cuplikan kode
Cara kode ini digunakan adalah
getImageData
untuk mendapatkan array formulirDan
map
itu ke array formulirSehingga nilai-nilai R dipetakan ke array dari set RGBA, dan nilai-nilai B, G, dan A berubah menjadi array nol nilai minimum. Ketika kita mengurutkan array ini, semua
[0,0,0,0]
array mengurutkan ke bawah dan array nilai riil mengurutkan secara normal di atas:Kami membaca sekilas bagian atas array (untuk kehilangan nilai kosong yang kami buat), meratakannya dengan
[].concat.apply
, dan berakhir dengan array dari form pertama lagi, tapi kali ini, diurutkan.Sedikit bermain golf dengan spasi putih dan komentar:
Perhatikan bahwa sebagian besar peramban mungkin gagal menjalankan kode ini untuk gambar besar, karena memberikan sejumlah besar argumen
[].concat
. Ketika lingkungan browser tidak memungkinkan memori yang cukup untuk semua argumen, pendekatan alternatif adalah memetakan kembali nilai-nilai RGBA dari array keempat teratas kembali ke array, untuk skor total 361 byte :Kami hanya mengganti
[].concat(...{stuff}).slice(12*w*h)
dengan{stuff}.map((v,i,A)=>A[3*w*h+(i>>2)][i%4])
.)sumber
concat.apply
Panggilan saya memasok terlalu banyak argumenconcat
dan mesin JS menolaknya.D:
Terima kasih! Saya akan memperbaikinya dan mencatat dua skor. (Dan saya senang saya bisa membantu!)Mathematica
86 8372 byteDengan 14 byte yang disimpan berkat @Martin Buttner.
Contoh
Gambar itu sendiri adalah input. Atau, variabel yang berisi gambar dapat digunakan.
sumber
ImageData
danArrayReshape
bisa menggunakan notasi infiks.Flatten
cukup lama untuk menyimpan beberapa byte dengan menetapkannyaf
. Dan apakah Anda benar-benar membutuhkan"Byte"
? Bukankah standar hanya akan menskala nilai saluran[0,1]
sedemikian rupa sehingga penyortiran dan rekonstruksi gambar masih akan berfungsi dengan baik?Javascript ES6, 334 byte
Tidak Disatukan:
sumber
appendChild
mengembalikan argumennya. Sangat berguna! Anda mengilhami saya untuk mengurangi entri saya dari 377 ke 354, tapi saya tidak bisa mengalahkan entri Anda :). (Ketika saya menggunakanappendChild
rantai danwith
teknik Anda, saya bisa mencapai 347, tapi masih 13 pergi!) Kerja luar biasa!C (menggunakan SDL1.2),
333322315 byteC kemungkinan besar bukan 'pisau paling tajam di rak' untuk jenis pekerjaan ini, toh saya ingin mencobanya. Tips untuk meningkatkan jawaban saya dipersilahkan. Program mendapatkan nama file gambar input sebagai argumen cli.
kompilasi dan jalankan:
gcc -I/usr/include/SDL snippet.c -lSDL -lSDL_image && ./a.out
Saya biasanya tidak bermain golf di C, tapi saya baru saja menjawab tantangan ini kemarin dan saya hanya ingin terus bermain dengan mainan baru itu :)
terima kasih kepada @ pseudonym117 karena membantu saya menghemat 5 byte
sumber
while
pada akhirnyafor(;;SDL_Flip(s));
, dan saya yakin Anda dapat menghilangkanint
metode iniC
dan menyimpan 4 byte lagi.JavaScript (ES6), 452
480484487511byteWow, ini lebih lama dari yang diharapkan:
Fungsi mengambil URL sebagai inputnya
f('test.jpg');
dan menarik hasilnya menjadicanvas
elemen yang ditambahkan kebody
.Perhatikan bahwa sumber harus pada domain yang sama atau skrip akan berhenti dengan masalah keamanan.
Keterbatasan
Saya sudah mengujinya di Firefox 42 pada OS X (10.10) pada mesin dengan 2,5 GHz i7 dan 16 GB RAM. Ukuran gambar maksimum yang dapat saya proses tanpa Firefox yang meminta untuk melanjutkan eksekusi skrip adalah 1600 x 1932 px .
Tidak disatukan
Keluaran
Untuk perbandingan yang lebih baik, saya juga mengambil " American Gothic " sebagai contoh sumber:
Suntingan
for (a in b)
alih-alihfor(;;)
. Berkat ar34zdocument
dalam variabel.()
.()
penciptaan objek on dan menghapus sepasang redundan lainnya()
. Terima kasih kepada apsillers .for
-loop yang mendapatkan warna dari setiap piksel.sumber
for(k in t)
yang akan menghemat beberapa byte lagi :)()
innew Image()
; gunakan string templat yang ditandai untuk argumen string Anda (createElement`canvas`
,getContext`2d`
), jangan gunakan tanda kurung untuk parameter fungsi panah tunggal (lakukan sajaf=u=>{...}
; parens hanya untuk fungsi panah multi-parameter atau nol-parameter). Anda juga mungkin memiliki satu atau duafor
loop pernyataan tunggal yang memiliki tanda kurung, yang tidak perlu.i.onload=$=>...
Alih-alihi.onload=()=>...
)for(l in u)f.push(u[l]);
bisa menjadifor(z of u)f.push(z);
:)
. -for(u of t)for(z of u)f.push(z)
Cukup pendek, tapi bisa dipersingkat lebih lanjutt.map(u=>u.map(z=>f.push(z)))
. Dalam banyak kasus, menggunakan.map
atau.some
dengan fungsi panah akan lebih pendek daripada menggunakanfor
loop. Jika Anda ingin pergi benar-benar gila, Anda dapat menyimpan lebih banyak di sini dengant.map(u=>f.push.apply(f,u));
yang mengatakan "Untuk setiap array yangu
dit
, pasokanu
sebagai daftar argumen untukf.push
melaluiapply
(karenapush
dapat menerima jumlah tak terbatas argumen dan mendorong semua dari mereka dalam rangka).Utilitas Bash + GNU, 80
Ini mengasumsikan format input / output dalam format .txt enumerasi piksel ImageMagick. Input dilewatkan sebagai nama file dan output pergi ke STDOUT.
Jika hal di atas tidak dianggap sebagai format gambar yang terkenal, maka kita dapat menambahkan konversi yang diperlukan:
Bash + Utilitas GNU + ImageMagick, 108
Input dan output ditetapkan sebagai nama file. ImageMagick menentukan format file apa yang akan digunakan oleh ekstensi file yang disahkan, sehingga kami dapat menggunakan yang umum:
O.png yang dihasilkan terlihat seperti:
sumber
Python 2, 128 byte
Asalkan gambar adalah file bernama
a
tanpa ekstensi, output akan menjadi file bernamab
tanpa ekstensi.sumber
a.putdata(sorted(b[f/c,f%d]for f in range(d*c)))
(saya baru saja bangun, jadi saya mungkin telah mencampuradukkan variabel).Java, 316 byte
Tempatkan nilai hexadecimal dari warna pixel dalam array. Array diurutkan, dan warnanya dipetakan kembali ke piksel dalam gambar. Nama gambar yang dihasilkan adalah
a.png
.sumber
SmileBASIC,
3935 byteDengan asumsi gambar dimuat ke halaman grafis 512 * 512:
Dijelaskan:
Sesederhana itu!
Sayangnya kita harus menggunakan bilangan bulat, yang menambahkan 4 byte ke ukuran program karena sufiks tipe.sumber
SYS/DEFSP.GRP
menempatkan aFF000000
di kiri atas dan00101010
di kanan bawah, yang merupakan kebalikan dari pertanyaan. Menggunakan pelampung menempatkan00000000
di kiri atas danFFF8F8F8
di kanan bawah, yang benar. (Tentu saja, ini memperlakukan warna hex sebagai unsigned / channel yang lebih tinggi lebih besar, yang mungkin benar.)0xFF000000
lebih kecil dari0x00101010
), tetapi bagaimanapun, saya tidak benar-benar yakin mengapa saya menggunakan bilangan bulat di sini ... Saya pikir di waktu saya tidak mengerti bagaimana GLOAD menggunakan nilai yang tidak ditandatangani ketika Anda menggunakan array float, dan hanya menganggap itu tidak berfungsi.Java,
424417404 byteYa, ini bukan bahasa yang Anda inginkan untuk bermain golf ...
sumber
C #, 497 byte
Posting pertama kali, golf pertama. Jelas bukan yang terbaik untuk bermain golf
Tidak benar-benar menghormati perpipaan. Mengambil jalur gambar sebagai input dan mengeluarkannya dengan huruf "o" yang sesuai dengan namanya.
Bekerja lebih baik dengan bitmap, hasil odds dengan orang lain
sumber
Haskell, 195 byte
Ini menggunakan
GD
perpustakaan. Penggunaanf <filename>
. File input harus dalampng
format. File keluaran dinamaio
.Cara kerjanya: langsung, yaitu membaca gambar, berjalan di atas semua koordinat dan mendapatkan piksel, mengurutkan piksel, berjalan di atas koordinat lagi, tetapi kali ini atur piksel sesuai urutan yang ditampilkan dalam daftar yang diurutkan, tulis file ke disk.
sumber