Có bao nhiêu hình dạng trong bức tranh này?


10

Trẻ em rất giỏi trong việc phân loại đồ vật và đếm chúng. Máy tính dường như có nhiều rắc rối hơn. Đây là một phiên bản đơn giản hóa của vấn đề này. Bạn có thể viết một chương trình nhỏ có thể phân loại và đếm các đối tượng trong một hình ảnh không?

Vấn đề: Cho một hình ảnh chứa một hoặc nhiều hình tròn và hình chữ nhật, trả về 2 số nguyên với số lượng hình tròn và số hình chữ nhật.

Quy tắc

  • Hình ảnh đầu vào sẽ là các hình màu đen trên nền trắng ở bất kỳ định dạng bitmap nào bạn chọn.
  • Chiều rộng và chiều cao hình ảnh sẽ nằm trong khoảng từ 100 đến 1000 pixel.
  • Số liệu sẽ được chứa đầy đủ trong hình ảnh.
  • Hình sẽ có chiều rộng dòng 1 pixel.
  • Hình ảnh sẽ không sử dụng khử răng cưa. Chúng sẽ chỉ có màu đen trên nền trắng.
  • Các hình có thể chạm, giao nhau hoặc ở trong một hình khác.
  • Các số liệu giao nhau sẽ có tối đa 4 pixel phổ biến.
  • Các vòng kết nối sẽ có đường kính từ 20 pixel trở lên.
  • Các cạnh hình chữ nhật sẽ dài từ 10 pixel trở lên.
  • Bạn không được sử dụng bất kỳ thư viện hoặc thư viện tích hợp nào nhận ra hình dạng hoặc bất kỳ chức năng nào khác khiến cho thách thức này trở nên tầm thường.
  • Trả lại hoặc in 2 số nguyên với số lượng hình tròn và hình chữ nhật.

ví dụ 1

ví dụ 1

Trả lời: 3 4

Ví dụ 2:

nhập mô tả hình ảnh ở đây

Trả lời: 4 13

Đây là một thử thách golf mã, vì vậy chương trình hoặc chức năng ngắn nhất trong mỗi ngôn ngữ sẽ giành chiến thắng.


Tôi đã có thể nói, việc đếm hình chữ nhật sẽ là về việc đếm các góc. Các vòng tròn sẽ khó hơn rất nhiều.
Bálint

Câu trả lời:


3

PHP - 355 byte

Số lượng byte không bao gồm '<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;}

Trong hai trường hợp thử nghiệm, các URL tôi đã sử dụng là http://i.stack.imgur.com/qnIFk.pnghttp://i.stack.imgur.com/HV9k3.png.

Đếm các đường ngang và chia cho hai để có được số lượng hình. Dựa vào quan sát rằng các vòng tròn có các phân đoạn ngang ngắn hơn và các hình chữ nhật có các phân đoạn ngang dài hơn.

Đã thừa nhận hack, không được bảo đảm để làm việc cho bất cứ điều gì khác ngoài các trường hợp thử nghiệm!

Tôi đã thử xoay các hình ảnh bằng ± 45 ° và phát hiện các đường ngang. Điều này sẽ tương đương với việc kiểm tra các đường chéo và sẽ chọn các vòng tròn tốt hơn, nhưng tôi không thể tìm thấy thuật toán nội suy để lại các cạnh đủ sạch để làm việc. Ví dụ: họ có thể làm nhòe một dòng thành hai hàng pixel và làm rối số đếm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.