Joe si ular lapar.
Dia makan gambar, satu pixel pada satu waktu.
Dia sangat menyukai piksel yang cerah.
Tantangan
Program Joe untuk memakan piksel paling terang yang bisa dia temukan, mengingat dia hanya bisa bergerak ke atas, bawah, kiri atau kanan.
Spesifikasi
- Joe harus mulai dari piksel kiri atas gambar.
- Joe hanya bisa bergerak secara horizontal atau vertikal dengan 1 setiap gerakan
- Joe hanya memiliki cukup waktu untuk memindahkan 1/3 dari jumlah piksel dalam gambar (1/3 bergerak sebanyak piksel). Jika jumlah piksel bukan kelipatan 3, bulatkan ke bilangan bulat terdekat.
- Joe dapat melintasi jalannya, meskipun itu dianggap sebagai 0 kecerahan
- Kecerahan didasarkan pada jumlah r, g dan b, sehingga rgb (0,0,0) memiliki kecerahan 0 sedangkan rgb (255.255.255) memiliki kecerahan maksimum.
Memasukkan
Anda dapat memasukkan gambar sesuka Anda.
Keluaran
- gambar yang menunjukkan hasil akhir gambar Anda (dengan piksel hitam yang dimakan).
- Jumlah kecerahan yang dimakan (sebutkan kisaran apa dalam jawaban Anda)
Mencetak gol
Program Anda akan dinilai pada:
- Rata-rata kecerahan piksel yang dimakan Joe / Kecerahan rata-rata piksel dalam gambar *
* Anda dapat meng-hardcode ini di program Anda
Skor total Anda akan menjadi rata-rata skor untuk gambar berikut:
Gambar uji:
http://upload.wikimedia.org/wikipedia/en/thumb/f/f4/The_Scream.jpg/800px-The_Scream.jpg
code-challenge
image-processing
Regangkan Maniac
sumber
sumber
[![image description](SE URL for downsized image)](URL for original image)
.Jawaban:
C ++, Skor:
1.420421.46766Ini pada dasarnya adalah versi yang sedikit lebih canggih dari dua solusi yang ada: Dari empat kemungkinan gerakan, ia memilih yang memaksimalkan kecerahan. Namun, alih-alih hanya melihat kecerahan piksel target, ini terlihat pada jumlah kecerahan piksel tertimbang di lingkungan piksel target, di mana piksel yang lebih dekat ke target memiliki bobot lebih besar.
EDIT: Menggunakan kecerahan nonlinear dalam perhitungan lingkungan meningkatkan skor sedikit.
Kompilasi dengan
g++ joe.cpp -ojoe -std=c++11 -O3 -lcairo
. Membutuhkan cairo.Jalankan dengan
joe <image-file> [<radius>]
.<image-file>
adalah input gambar PNG.<radius>
(argumen opsional) adalah jari-jari dari lingkungan yang dijumlahkan, dalam piksel (lebih kecil lebih cepat, lebih besar (kira-kira) lebih baik.) Output skor dan gambar bernamaout.<image-file>
.Hasil
Lebih banyak eye-candy
sumber
if (o_neighborhood > o_max_neighborhood) o_max = *o, o_max_neighborhood = o_neighborhood;
hanya kode ini yang menetapkannya. Namun karena nan terlibat, perbandingannya selalu salah, sehingga o_max tidak pernah diset dan digunakan tidak diinisialisasi.Python 3, skor = 1,57
Pertama-tama ular kami melakukan perjalanan gambar menciptakan garis-garis vertikal dengan jarak yang sama satu sama lain.
Kita dapat memperluas ular ini dengan mengambil dua titik di samping satu sama lain dalam garis vertikal dan membuat satu lingkaran yang titik akhirnya adalah mereka.
Kami mengatur poin menjadi pasangan dan untuk setiap pasangan kami menyimpan ukuran dan nilai kecerahan rata-rata dari loop yang memberi memiliki kecerahan rata-rata terbesar.
Pada setiap langkah kami memilih pasangan dengan nilai tertinggi memperpanjang loop-nya untuk mencapai kecerahan rata-rata maksimum pada ekstensi dan menghitung ukuran loop optimal dan nilai kecerahan untuk pasangan.
Kami menyimpan kembar tiga (nilai, ukuran, point_pair) dalam struktur tumpukan yang diurutkan berdasarkan nilai sehingga kami dapat menghapus elemen terbesar (di O (1)) dan menambahkan yang baru dimodifikasi (di O (log n)) secara efisien.
Kita berhenti ketika kita mencapai batas jumlah piksel dan ular itu akan menjadi ular terakhir.
Jarak antara garis vertikal memiliki efek yang sangat kecil dalam hasil sehingga dipilih 40 piksel konstan.
Hasil
Catatan: gambar asli "The Scream" tidak tersedia sehingga saya menggunakan gambar "The Scream" lainnya dengan resolusi yang sama.
Gif menunjukkan proses perpanjangan ular pada gambar "swirl":
Kode mengambil satu (atau lebih spasi terpisah) nama file dari stdin dan menulis gambar ular yang dihasilkan ke file png dan mencetak skor ke stdout.
sumber
Python 2 (skor: 0,0797116)
Hanya algoritma serakah yang sangat sederhana dan naif untuk mendapatkan bola bergulir.
Keluaran:
sumber
sum of brightnesses of eaten pixels / amount of eaten pixels
apakah formula yang tepat, benar? Mungkin ini hanya algoritma yang sangat mengerikan;)The average brightness of pixels Joe eats / The average brightness of the pixels in the picture*
Jawa (skor: 0,6949)
Algoritma sederhana yang memakan piksel paling terang dari empat piksel yang mengelilingi piksel saat ini. Dalam kasus seri, piksel yang dimakan adalah acak, mengarah ke skor yang berbeda dan menghasilkan gambar setiap eksekusi. Dengan demikian, skor di bawah ini adalah rata-rata lebih dari 50 eksekusi pada setiap gambar.
Untuk menjalankannya, edit tiga argumen (ada sebagai konstanta kelas) di sumber, atau berikan melalui baris perintah dalam bentuk di
java HungryImageSnake <source> <iterations> <printScores>
mana<source>
file sumber gambar untuk dimakan,<iterations>
adalah berapa kali memakan gambar (mengambil skor rata-rata dan menyimpan skor terbaik di atas semua iterasi), dan<printScores>
benar untuk mencetak skor setiap iterasi atau salah untuk tidak.Skor rata-rata, berdasarkan gambar, lebih dari lima puluh iterasi:
Skor terbaik, berdasarkan gambar, lebih dari lima puluh iterasi yang sama:
Gambar dengan skor tertinggi:
Seperti terlihat dari gambar, jauh lebih sedikit dari sepertiga piksel benar-benar dimakan, karena ular kadang-kadang terjebak di antara piksel yang sudah dimakannya, di mana ia tetap terjebak di dalam area mati sampai keacakan gerakannya membawanya ke bagian yang dapat dimakan dari gambar.
Juga sebagai hasil dari piksel pemakan ular, nilainya bias ke bawah, karena nol-kecerahan piksel mati sekali lagi diperhitungkan dalam rata-rata. Saya akan berharap untuk melihat skor yang jauh lebih tinggi jika algoritma skor dimodifikasi untuk hanya dibagi dengan jumlah gerakan yang menyebabkan memakan piksel baru, daripada semua gerakan (termasuk yang ular memakan piksel yang sudah mati yang dimakan sebelumnya sebelum dimakan). ).
Tentu saja, pendekatan yang lebih baik adalah membuat semacam heuristik kecerahan untuk setiap piksel dan menemukan jalur
width * height / 3
piksel dengan kecerahan rata-rata tertinggi, tetapi saya ragu pendekatan ini akan optimal dalam jangka waktu, terutama pada gambar yang lebih besar, karena jumlahnya permutasi yang mungkin akan sangat besar. Saya dapat mengambil beberapa bentuk pendekatan ini nanti dan mempostingnya dalam jawaban yang terpisah jika demikian.sumber
Python 2, Nilai: 1,205
Saya mengumpulkan solusi Python cepat beberapa waktu lalu tetapi lupa mempostingnya. Ini dia. Ia menemukan blok terkaya dalam gambar, kemudian melakukan perjalanan ke setiap blok, memakan semua blok terbaik yang ada.
Hasil
Contoh Gambar
Python 2.7 Code
sumber