Menggunakan Algodoo dan Paint, saya membuat enam gambar monokromatik 300 × 300 dengan empat bentuk yang nyaman:
Kelas gambar ini memiliki properti berikut:
- Mereka selalu 300 × 300 piksel, monokromatik (hanya hitam dan putih), dan memiliki empat wilayah putih yang sesuai dengan kotak, lingkaran, segitiga, dan roda gigi.
- Bentuknya tidak pernah tumpang tindih atau saling menyentuh, juga tidak menyentuh batas gambar atau keluar batas.
- Bentuknya selalu memiliki ukuran yang sama, tetapi mereka dapat diputar dan diposisikan dengan cara apa pun.
(Bentuknya juga memiliki area yang sama, meskipun ketika diraster seperti ini jumlah pikselnya tidak mungkin sama persis.)
Tantangan
Tulis program atau fungsi sesingkat mungkin yang menggunakan nama file dari gambar seperti itu dan mengubah semua piksel putih ...
- merah
(255, 0, 0)
jika mereka berada di alun-alun. - biru
(0, 0, 255)
jika mereka berada di lingkaran. - hijau
(0, 255, 0)
jika mereka berada di segitiga. - kuning
(255, 255, 0)
jika mereka berada di gigi.
misalnya
Detail
Program Anda harus bekerja secara efektif untuk semua gambar input yang mungkin. (Hanya 300 × 300 gambar monokromatik yang akan dimasukkan.) Keenam gambar yang saya berikan hanyalah contoh, Anda mungkin tidak dapat meng-hardcode outputnya ke dalam program Anda.
Anda tidak dapat menggunakan perpustakaan atau fungsi visi komputer, built-in atau eksternal. Intinya adalah melakukan ini menggunakan operasi level-pixel Anda sendiri. Anda dapat menggunakan pustaka gambar yang memungkinkan Anda membuka dan mengubah gambar (mis. PIL untuk Python).
Anda dapat menggunakan format file gambar lossless umum untuk input dan output selama Anda tetap pada skema warna.
Anda dapat mengambil nama file gambar sebagai argumen fungsi, dari stdin, atau dari baris perintah. Gambar output dapat disimpan ke file baru, file yang sama, atau hanya ditampilkan.
Mencetak gol
Kiriman dengan byte paling sedikit menang. Saya dapat menguji pengiriman dengan gambar tambahan untuk menentukan validitasnya.
sumber
Jawaban:
J -
246.224185 byteIni menyenangkan!
Saya menggunakan kembali komponen yang terhubung yang saya gunakan untuk tantangan "Apakah saya di ruangan terbesar" , dan menggunakan rasio antara rata-rata dan jarak maksimum semua titik ke masing-masing pusat komponen. Saya setuju untuk ini, karena skala dan invarian rotasi, dan tampaknya cukup baik untuk membedakan antara bentuk yang diberikan. Pemeringkatan nilai ini dari rendah ke tinggi memberi saya lingkaran urutan, roda gigi, bujur sangkar, dan segitiga, yang digunakan untuk mengubah urutan colormap.
Menampilkan hasilnya menggunakan addon viewmap. Tidak ada kotak alat yang digunakan kecuali untuk pembacaan dan keluaran file.
Robustness tampaknya tidak menjadi persyaratan, ini lepas landas 18 byte. 2 lebih banyak ruang yang tidak perlu, diganti
&.>
dengan&>
inratio
dan&.:
by&:
dcent untuk 2 byte lainnya.Keuntungan besar dalam hal kependekan dan kinerja
comp
menggunakan alih-alihcut
(;.
). Dengan cara ini, gambar direplikasi dan dipindahkan ke semua 8 arah alih-alih memindai dengan jendela 3x3.The
id
Fungsi adalah ridiculously kompleks untuk apa yang diperlukan untuk melakukan. Sekarang ia menetapkan id ke piksel dalam objek dengan mengalikan gambar dengan array angka unik, karenanya mengatur BG ke nol.Kode sedikit lebih dijelaskan:
Yang ini agak panjang untuk menjelaskan secara rinci, tetapi akan dilakukan jika ada minat.
sumber
Mathematica,
459392 byteTidak Disatukan:
Saya bisa menghemat 6 byte lebih banyak dengan mengubahnya
m=1.Mean@a;m=#-m&/@a;
menjadim=#-Mean@a&/@a;
, tetapi itu secara signifikan meledakkan waktu eksekusi, yang menjengkelkan untuk pengujian. (Perhatikan, bahwa ini adalah dua optimisasi: mengeluarkan perhitunganMean@a
out of loop dan menggunakan tipe simbolik yang tepat alih-alih angka floating point. Menariknya, penggunaan tipe yang tepat jauh lebih signifikan daripada menghitung rata-rata dalam setiap iterasi.)Jadi ini adalah pendekatan nomor tiga:
Sekarang untuk semua piksel dalam bentuk, mari kita plot jarak dari sudut vs ke pusat itu:
Segitiga memiliki 3 maxima yang jelas, kuadrat 4, roda gigi 16, dan lingkaran memiliki ton, karena fluktuasi aliasing tentang jari-jari konstan.
150
adalah maksimum.Sebagai catatan, jika saya menggunakan ide Ell, dan cukup mengurutkan wilayah berdasarkan jarak terbesar antara piksel dan pusat, saya bisa melakukan ini dalam 342 byte:
Tetapi saya tidak bermaksud untuk bersaing dengan itu, selama semua orang menggunakan algoritma asli mereka sendiri, alih-alih bermain dengan yang lain.
sumber
Jawa,
1204113210871076Hanya untuk membuktikan pada diri sendiri bahwa saya bisa melakukan ini.
Saya memasukkan impor tepat di sebelah fungsi deklarasi; ini harus berada di luar kelas agar ini berfungsi:
Tidak digabungkan (dan runnable; yaitu boilerplate ditambahkan):
Ini bekerja dengan mengulangi setiap piksel gambar dan mengisi banjir setiap kali kita mencapai "lubang". Kami menambahkan setiap hasil banjir sebagai
Set<Point>
aSet
. Lalu kita tentukan bentuk mana yang mana. Ini dilakukan dengan melihat jumlah piksel batas bentuk. Saya mendefinisikan batas sebagai langkah ksatria menjauh dari ubin hitam, karena itu akan tetap lebih konstan antara rotasi dan semacamnya. Ketika kita melakukan ini, menjadi jelas bahwa bentuk dapat diurutkan berdasarkan nilai itu: Circle, Square, Triangle, Gear. Jadi saya mengurutkan dan mengatur semua piksel dari bentuk itu ke warna yang benar.Perhatikan bahwa gambar yang saya tulis tidak langsung diambil dari file, karena jika saya melakukan itu, Java akan memperlakukan gambar sebagai hitam dan putih dan mengisi dengan warna tidak akan berhasil. Jadi saya harus membuat gambar saya sendiri dengan
TYPE_INT_RGB
(yang1
). Perhatikan juga bahwa gambar yang sedang saya kerjakan adalah302
dengan302
; ini agar algoritma jarak Knight tidak perlu khawatir tentang upaya untuk membaca di luar batas pada gambar. Saya memperbaiki perbedaan ini dalam ukuran dengan meneleponi.getSubImage(1,1,300,300)
. Catatan: Saya mungkin lupa untuk memperbaikinya ketika saya mengunggah gambar, dalam hal ini gambarnya 2 piksel terlalu lebar, tetapi kecuali untuk fakta ini, mereka harus benarFungsi ini akan menimpa file yang jalurnya dilewati. Output:
sumber
Python,
571 567528 byteDemikian pula dengan solusi Quincunx, itu dimulai dengan mengisi setiap bentuk dengan indeks dari 1 hingga 4. Kemudian menentukan identitas bentuk dengan jari-jari lingkaran pembatas mereka. Palet warna dikonstruksi sesuai dan gambar disimpan sebagai gambar warna yang diindeks.
EDIT: Merindukan fakta bentuk dijamin tidak menyentuh batas gambar. Lebih pendek, kalau begitu!
Mengambil nama file input pada baris perintah dan menulis output ke
o.png
.sumber
Mathematica 225
Perbarui :
OP memutuskan bahwa pendekatan ini menggunakan fungsi visi komputer, sehingga tidak lagi berjalan. Saya akan membiarkannya diposting. Mungkin seseorang mungkin menganggapnya menarik.
ImageData
mengembalikan gambar sebagai matriks 0 dan 1.Flatten
mengubah matriks itu menjadi daftar.Morphological Components
menemukan 4 cluster piksel dan menetapkan integer yang berbeda, 1, 2, 3, 4 untuk setiap piksel sesuai dengan cluster. 0 dicadangkan untuk latar belakang (hitam).ComponentMeasurements
menguji sirkularitas cluster.Dari yang paling ke paling tidak melingkar akan selalu: lingkaran, kuadrat, segitiga, dan roda gigi.
ReplacePart
mengganti setiap integer komponen dengan warna RGB masing-masing, menggunakan semacam sirkularitas.Partition...Dimensions[m][[2]]
mengambil daftar warna piksel, dan mengembalikan matriks dimensi yang sama dengan gambar input.Image
mengubah matriks warna piksel menjadi gambar berwarna.sumber
f@i_:=Image[#/.Append[Thread[Ordering[Last/@ComponentMeasurements[#,"Circularity"]]->{Yellow,Green,Red,Blue}],0->Black]]&@MorphologicalComponents@i
{RGBColor[1, 0, 0], RGBColor[0, 1, 0], RGBColor[0, 0, 1], RGBColor[1, 1, 0]}
mana 1 berkorespondensi dengan 255. Tidak ada perpustakaan yang digunakan.MorphologicalComponents
memenuhi atau melanggar aturan Anda. Begitu orang mengetahui di mana setiap piksel dimiliki, ada banyak cara, termasuk jumlah piksel mentah, untuk menentukan angka mana.(255,0,22)
ketika saya check in Paint). Saya tidak memiliki Mathematica jadi saya tidak bisa berlari untuk memastikan.Mathematica,
354345314291288Masih bermain golf, bisa dipersingkat dengan beberapa karakter lagi, tetapi kinerjanya menjadi tak tertahankan. Menggunakan Varians untuk mengidentifikasi bentuk:
Dengan jarak:
Pengujian:
Ini benar-benar tanpa bulu. Akan menambahkan penjelasan nanti:
sumber
Python,
579577554514502501 byteUntuk setiap bentuk, isi banjir, lalu hitung jarak antara pusat massa dan titik terjauh.
maka permukaan bentuk yang sebenarnya dibandingkan dengan permukaan segitiga, bujur sangkar, cakram atau roda yang akan memiliki ukuran yang sama.
sumber
C # 1086 byte
Namun solusi penimbunan lain, hanya untuk catatan karena tidak ada versi C # di sini. Seperti Quincunx saya ingin membuktikan diri bahwa saya dapat melakukannya dan tidak ada banyak perbedaan dengan pendekatannya di Jawa.
Ini menerima setiap format gambar.
Mungkin dapat dilucuti beberapa charachters dengan menghapus semua hal-hal statis dan membuat instance Program.
Versi yang Dapat Dibaca:
Golf:
sumber