Mengingat gambar yang hanya memiliki piksel hitam dan putih dan lokasi (x, y) yang merupakan piksel putih, warnai piksel putih berdasarkan jarak Manhattan minimum dari (x, y) di jalur yang hanya melibatkan melintasi piksel putih lainnya.
The rona piksel berwarna harus sebanding dengan jarak mereka dari (x, y), sehingga piksel pada (x, y) akan memiliki rona 0 ° (merah murni) dan piksel terjauh dari (x, y) akan memiliki rona 360 ° (juga merah), dengan rona lainnya bercampur mulus dan linier di antaranya. The saturasi dan nilai keduanya harus 100%.
Jika piksel putih tidak terhubung ke (x, y) melalui piksel putih lainnya, maka piksel itu harus tetap putih.
Detail
- Input akan terdiri dari nama file gambar atau data gambar mentah, ditambah bilangan x dan y.
- Gambar output dapat disimpan ke file atau disalurkan mentah ke stdout dalam format file gambar umum, atau hanya ditampilkan.
- Nilai x adalah 0 pada piksel paling kiri, dan meningkat ke kanan. Nilai y adalah 0 pada piksel paling atas dan naik turun. (x, y) akan selalu berada dalam batas gambar.
- Program dan fungsi lengkap diizinkan.
Kode terpendek dalam byte menang.
Contohnya
Semua gambar ini telah dirampingkan untuk menghemat ruang. Klik untuk melihat ukuran penuh.
Input gambar:
(x,y) = (165,155)
dan (x,y) = (0,0)
Input gambar dan output dengan (x,y) = (0,0)
:
Input gambar dan output dengan (x,y) = (600,350)
:
Input gambar dan output dengan (x,y) = (0,0)
:
Input gambar dan output dengan (x,y) = (0,0)
:
Opsional -30% bonus: gunakan jarak Euclidean. Saran untuk algoritme Anda adalah sebagai berikut (garis besar umum):
- Memiliki piksel awal.
- Isi banjir dari piksel itu.
- Untuk setiap piksel yang dicapai dalam isi banjir,
- Pindah dari piksel awal ke piksel dalam setengah unit langkah, dalam garis lurus.
- Pada setiap langkah, terapkan
int()
pada koordinat x dan y. Jika piksel pada koordinat ini berwarna hitam, berhenti. Kalau tidak, lanjutkan. (Ini adalah metode line-of-sight.) - Setiap piksel yang mencapai yang membatasi piksel putih dan / atau piksel yang sebelumnya diberi label dengan jarak yang jauh lebih tinggi (yaitu +10) menjadi piksel awal.
Dalam arti yang lebih meta, algoritma ini menyebar ke setiap piksel yang dapat dijangkau dalam garis lurus dari piksel awal / yang sudah berwarna, lalu "inci" di sekitar tepinya. Bit "jarak jauh lebih tinggi" dimaksudkan untuk mempercepat algoritma. Jujur, tidak masalah bagaimana Anda menerapkan jarak Euclidean, hanya saja harus terlihat seperti ini.
Inilah contoh pertama yang terlihat dengan jarak Euclidean, menggunakan algoritma di atas:
Masukkan gambar dan (x,y) = (165,155)
Terima kasih banyak kepada Calvin Hobi dan trichoplax karena telah membantu menulis tantangan ini! Selamat bersenang-senang!
sumber
Jawaban:
Matlab,
255 245231 byteIni mengharapkan nama gambar pertama, lalu
y
dan kemudianx
.Saya menerapkan pengisian banjir (atau 'dijkstra untuk 4-lingkungan' jika Anda mau) secara kasar dengan terlebih dahulu membuat topeng di mana piksel benih diatur ke 1 dan dengan akumulator jarak (keduanya ukuran gambar) dan kemudian mengulangi mengikuti Langkah:
k
k
Ini meninggalkan kita dengan jarak manhattan dari setiap piksel ke piksel awal dalam akumulator jarak. Kemudian kita membuat gambar baru dengan pergi ke kisaran warna yang diberikan dan memetakan rona "pertama" ke nilai nol dan rona "terakhir" ke jarak maksimal.
Contohnya
Sebagai bonus, di sini gambar cantik tentang bagaimana jarak dihitung. lebih terang = lebih jauh.
sumber
Blitz 2D / 3D , 3068 * 0.7 = 2147.6
Ini adalah implementasi referensi untuk algoritma Euclidean, golf.
Sebenarnya, saya agak benci betapa tidak terbacanya ini dibandingkan dengan aslinya. (Yaitu, kebetulan, 5305 byte.) Sebenarnya, saya bisa memotong beberapa byte lagi dengan menggunakan nama variabel satu karakter untuk semuanya, tapi ini sudah cukup konyol. Dan itu tidak akan menang dalam waktu dekat. : P
sumber
C ++ / SFML:
127112351226 byte-36 bytes terima kasih ke user202729 -9 bytes berkat Zacharý
The
sf::Image
parameter juga output (akan dimodifikasi). Anda bisa menggunakannya seperti itu:Parameter pertama adalah input gambar (dan output), parameter kedua dan ketiga adalah
x
dany
parameter di mana ia harus memulaisumber
setPixel(j, i,hsv2
danFI(xm,ym) (std::find_if
benar-benar diperlukan?G(d,a,b,c)
dancase d:
. Juga, ruang antaracase d:
danreturn C(a,b,c)
tidak dibutuhkan juga.(b>m?b:m)
tidak memerlukan tanda kurung, dan(t/60)%6
=>t/60%6
atas perintah operasi.xm
danym
untuk namaG(d,a,b,c)
dancase
,FI
,ti
, danhsv2rgb
masing-masing dapat diganti dengan nama yang lebih pendek.C ++,
979 969 898 859848 byteRGBARGB (dihasilkan dalam file: d)Bukan "ungolf" langsung tetapi ini adalah prototipe C yang saya tiru pertama kali:
Banyak konsep yang tetap serupa, tetapi tentu saja ada banyak sekali perubahan kecil. Untuk mengkompilasi bahwa sebagai C Anda perlu menggunakan C11 (C99 mungkin akan bekerja tetapi saya hanya benar-benar diuji di C11).
Saya cukup menikmati tantangan ini, terima kasih telah memberi saya ide untuk mencoba sesuatu yang baru :).
Sunting: Golf sedikit lebih baik.
Sunting2: Menggabungkan dua struct sehingga pixel saya dan antriannya sama, sedikit lebih banyak penyalahgunaan makro, dan menggunakan 255 yang direfleksikan sehingga dapat didefinisikan sebagai -1 ketika mendefinisikan serangkaian karakter yang tidak ditandai, dan terakhir menghapus panggilan fungsi.
Sunting3: Digunakan kembali beberapa variabel lagi, tweak diutamakan operator, dan output dikonversi ke RGB menghemat saluran alpha
Edit4: Saya pikir saya sudah selesai dengan ini sekarang, beberapa perubahan aritmatika pointer dan tweak aliran kontrol sedikit.
sumber
Python 3 dan matplotlib, 251 byte
Input adalah array numpy MxNx3 yang dikembalikan oleh
imshow()
fungsi matplotlib . Input dimodifikasi oleh fungsi sehingga harus disalin sebelumnya. Ini menampilkan gambar secara otomatis jika matplotlib dalam mode "interaktif"; jika tidak, panggilan keshow()
harus ditambahkan selama 7 byte lainnya.Output dibuat dengan pertama-tama menampilkan gambar asli dan kemudian menampilkan gambar pelangi di atasnya. Matplotlib dengan mudah memperlakukan inf dan nan transparan sehingga gambar hitam putih terlihat.
sumber