Kata pengantar
Ketika saya menembakkan sebuah panahan 900 putaran sebelumnya hari ini (10 berakhir dengan 6 panah per akhir, dan 10 berakhir pada 3 panah per akhir, dengan total 90 panah dan skor maksimum 900), saya memikirkan tantangan ini.
Dalam memanah (dengan asumsi bahwa Anda memotret pada wajah target yang disediakan FITA [selembar kertas yang Anda tembak]), untuk setiap panah Anda dapat mengklaim skor maksimum 10. Wajah target berisi 10 atau 11 cincin dengan diameter menurun, bersarang di dalam satu sama lain. Dari cincin dalam ke luar, ini dihitung dari 10 poin, ke satu titik (dan dalam kasus 11 cincin, ada cincin terdalam sekunder yang dihitung sebagai 'X', yang skornya 10 tetapi digunakan dalam kasus tie breaking sebagai nilai yang lebih tinggi). Mengamati:
Tentu saja, saya mengacu pada penilaian Metrik FITA, seperti yang terlihat pada ilustrasi di atas. Jika Anda melihat lebih dekat, Anda dapat mengamati cincin terdalam, yang merupakan garis putus-putus pudar, yang nilainya tidak ditandai. Itu adalah 'X' yang saya maksudkan, tetapi Anda tidak perlu memperhatikan hal itu kecuali bersaing untuk mendapatkan bonus.
Tantangan
Buat fungsi (atau program lengkap, jika bahasa tidak mendukung fungsi), yang menerima gambar kuadrat sempurna sebagai input (atau nama file gambar, jika perlu), yang mengandung sejumlah warna hijau (HEX # 00FF00, RGB (0, 255, 0)) titik-titik dengan ukuran tertentu, dan mengembalikan skor. Gambar mungkin berisi data selain dari titik hijau , tetapi hijau akan selalu menjadi warna yang sama persis.
Anda dapat membayangkan bahwa gambar persegi mewakili wajah target, dengan cincin terluar menyentuh pada 4 titik (tengah atas, tengah bawah, tengah kanan, tengah kiri). Wajah target yang diwakili akan selalu memiliki proporsi yang sama, dengan semua cincin memiliki lebar tepat 1/20 dari lebar gambar target input. Sebagai contoh, diberikan gambar input dimensi input 400px oleh 400px, Anda dapat mengasumsikan bahwa setiap cincin memiliki lebar bagian dalam 20px, seperti diilustrasikan di bawah ini:
Klarifikasi
- Jika menyentuh dua dering terpisah, semakin tinggi dari kedua dering itu dihitung
- Anda tidak harus secara otomatis menghitung kesalahan atau kasus 'x', kecuali mencoba bonusnya
- Anda dapat berasumsi bahwa tidak ada lingkaran hijau yang tumpang tindih
- Anda juga dapat mengasumsikan bahwa tidak ada piksel lain dari naungan hijau di dalam gambar
- Gambar akan dalam format PNG, JPEG atau PPM (pilihan Anda)
- Pustaka pemrosesan gambar eksternal diizinkan, jika ditulis sebelum posting pertanyaan ini
- Anda dapat mengasumsikan bahwa semua lingkaran hijau pada satu target akan memiliki diameter yang sama
- Jika memotret (hah) untuk bonus lingkaran yang tumpang tindih, Anda dapat mengasumsikan bahwa setidaknya satu lingkaran pada gambar tidak memiliki tumpang tindih lainnya
- Celah standar tidak diijinkan
Uji kasus
Dua kasus berikut harus masing-masing skor 52 (atau dalam kasus bonus, 52 dengan 1 'x' dan 1 kehilangan):
Dan test case terakhir ini harus skor 25 :
Bonus
- -25 byte jika Anda juga mengembalikan jumlah kesalahan (di luar salah satu cincin) juga
- -30 byte jika Anda juga mengembalikan jumlah Xs (anggap x paling dalam adalah 3/100 dari lebar gambar, dan 10 kemudian 2/100 dari lebar gambar. 1-9 proporsi tetap tidak berubah)
- -35% jumlah byte jika Anda memperhitungkan lingkaran yang tumpang tindih
Ini adalah kode golf, sehingga byte paling kecil menang. Selamat bersenang-senang!
sumber
Jawaban:
Memproses 2, 448-25 = 423 byte
Membaca dalam file gambar untuk loop melalui piksel sampai menemukan hijau kemudian banjir mengisi lingkaran menentukan titik yang paling dekat dengan pusat. Kemudian tambahkan skor itu menjadi total. jika skornya negatif, itu ditambahkan ke miss counter.
Program akan menampilkan 2 angka, yang pertama adalah skor dan yang kedua adalah jumlah yang gagal.
Anda dapat memproses di sini
sumber
Perl 5 + GD: 225 - 25 = 200
Sunting: Ditemukan alasan untuk pembacaan piksel yang salah dalam PNG yang diindeks dan menerapkan solusi.
Untuk beberapa alasan dengan perpustakaan GD nilai-nilai piksel hijau dibaca sebagai (4,254,4). Saya tidak yakin apakah ini khusus untuk file PNG yang termasuk dalam pertanyaan.Jeda baris dapat dihapus dalam kode di bawah ini.Mengambil gambar PNG pada input dan mencetak 2 nilai: Jumlah titik dan kesalahan. Sebagai contoh:
Perubahan menit terakhir:
Dalam mode true color yang saya butuhkan pula indeks warna yang digunakan oleh
getPixel
danfill
hanya integer nilai RGB yang dikodekan, jadi tidak perlu menggunakanrgb
dancolorAllocate
mengkonversi ke dan dari indeks tersebut.Penjelasan:
sub v
yang mengambil parameter melalui$_
bukannya parameter standar karena lebih pendek).sumber
Haskell -
579-25 = 554603-25-30576-25-30 = 521 BytesStrategi:
Output adalah triple (skor, misses, Xs), mis
(52,1,1)
untuk gambar uji.Program mungkin gagal jika piksel lingkaran terdekat dengan pusat berada dalam 3 piksel lingkaran lain.
sumber
all id
sama denganand
.juga, Anda dapat menerapkanj
dengan penjaga polaj n m|PixelRGBA8 0 255 0 _<-getColor n m v=0<1|0<1=0>1
Mathematica -
371386 - 25 = 361Solusi yang lebih optimal. Menghitung jawabannya jauh lebih cepat daripada solusi Python saya.
Python with PIL - Solusi sepele dan tidak optimal, 961 byte
Ini hanya untuk mencoba menunjukkan pendekatan konyol dalam menyelesaikan masalah. Dibutuhkan ~ 2 menit untuk menjalankan dua uji kasus pertama, dan ~ 20 menit untuk menjalankan yang ketiga pada sistem saya karena cepat membuat, sangat intensif sumber daya, dan detektor lingkaran rumit algoritmik. Meskipun demikian, ia memenuhi persyaratan, meskipun tentu tidak golf secara optimal. Semakin banyak warna hijau pada gambar, semakin lama waktu yang dibutuhkan untuk menjalankannya.
Mengambil objek gambar PIL, dan mengembalikan skor.
Langkah-langkah yang dibutuhkan:
n
, jika ada yang merupakan piksel hijau kemudian tambahkan mereka ke lingkaransumber
a
dapat ditulis sebagaia=lambda x,y,w,h:[(X,Y)for X in(x-1,x,x+1)for Y in(y-1,y,y+1)if w>X>-1<Y<h]