Berapa banyak bentuk dalam gambar ini?

10

Anak-anak sangat pandai mengklasifikasikan objek dan menghitungnya. Komputer tampaknya memiliki lebih banyak masalah. Ini adalah versi sederhana dari masalah ini. Bisakah Anda menulis program kecil yang dapat mengklasifikasikan dan menghitung objek dalam suatu gambar?

Masalahnya: Diberikan gambar yang mengandung satu lingkaran atau lebih dan empat persegi panjang, mengembalikan 2 bilangan bulat dengan jumlah lingkaran dan jumlah persegi panjang.

Aturan

  • Gambar input akan berupa gambar hitam dengan latar belakang putih dalam format bitmap apa pun yang Anda pilih.
  • Lebar dan tinggi gambar akan antara 100 dan 1000 piksel.
  • Angka akan sepenuhnya terkandung dalam gambar.
  • Angka akan memiliki lebar garis 1 piksel.
  • Gambar tidak akan menggunakan anti-aliasing. Hanya hitam putih saja.
  • Angka dapat menyentuh, berpotongan, atau berada di dalam sosok lain.
  • Gambar berpotongan akan memiliki maksimum 4 piksel umum.
  • Lingkaran akan memiliki diameter 20 piksel atau lebih.
  • Sisi persegi panjang akan 10 atau lebih piksel.
  • Anda tidak boleh menggunakan built-in atau pustaka yang mengenali bentuk, atau fungsi lain yang membuat tantangan ini sepele.
  • Kembalikan atau cetak 2 bilangan bulat dengan jumlah lingkaran dan persegi panjang.

Contoh 1

Contoh 1

Jawab: 3 4

Contoh 2:

masukkan deskripsi gambar di sini

Jawab: 4 13

Ini adalah tantangan kode golf, sehingga program atau fungsi terpendek dalam setiap bahasa akan menang.

Ksatria Logika
sumber
Saya sudah tahu, menghitung persegi panjang adalah tentang menghitung sudut. Lingkaran akan jauh lebih sulit.
Bálint

Jawaban:

3

PHP - 355 byte

Jumlah byte tidak termasuk '<image-url>'.

<?php
m('<image-url>');function m($f){$i=imagecreatefrompng($f);$r=f($i,17);$c=f($i,9);echo($c-$r).' '.$r."\n";}function f($i,$k){$w=imagesx($i);$h=imagesy($i);$r=0;for($y=0;$y<$h;$y++)for($x=0;$x<$w;$x++)if(!imagecolorat($i,$x,$y))$r+=g($i,$x,$y,$w,$k);return$r;}function g($i,&$x,$y,$w,$k){$l=$x;while(!imagecolorat($i,$x,$y)&&$x<$w)$x++;return($x-$l>$k)?1/2:0;}

Dalam dua kasus pengujian, URL yang saya gunakan adalah http://i.stack.imgur.com/qnIFk.pngdan http://i.stack.imgur.com/HV9k3.png.

Menghitung garis horizontal dan membaginya menjadi dua untuk mendapatkan jumlah bentuk. Bergantung pada pengamatan bahwa lingkaran memiliki segmen horisontal yang lebih pendek dan persegi panjang memiliki segmen horizontal yang lebih panjang.

Mengakui hack, tidak dijamin bekerja untuk apa pun selain kasus pengujian!

Saya mencoba memutar gambar dengan ± 45 ° dan mendeteksi garis horizontal. Ini akan sama dengan memeriksa garis-garis diagonal dan akan mengambil lingkaran lebih baik, tetapi saya tidak dapat menemukan algoritma interpolasi yang meninggalkan tepi yang cukup bersih untuk bekerja dengannya. Misalnya, mereka dapat mengotori garis menjadi dua baris piksel dan mengacaukan hitungan.


sumber