Скільки фігур на цьому малюнку?


10

Діти дуже добре класифікують предмети та рахують їх. Здається, комп’ютери мають більше проблем. Це спрощена версія цієї проблеми. Чи можете ви написати невелику програму, яка може класифікувати та рахувати об’єкти на зображенні?

Проблема: Давши зображення, що містить одне або більше кіл та прямокутників, поверніть 2 цілих числа з кількістю кіл та кількістю прямокутників.

Правила

  • Вхідним зображенням будуть чорні фігури на білому тлі у будь-якому обраному растровому форматі.
  • Ширина та висота зображення становитимуть від 100 до 1000 пікселів.
  • Цифри повністю містяться в зображенні.
  • Цифри матимуть 1 піксельну ширину лінії.
  • Зображення не використовуватимуть згладжування. Вони будуть чорними лише на білому.
  • Фігури можуть торкатися, перетинатися або знаходитися всередині іншої фігури.
  • Перетинаються фігури матимуть максимум 4 загальних пікселя.
  • Кола матимуть діаметр 20 пікселів і більше.
  • Сторони прямокутника становитимуть 10 і більше пікселів.
  • Ви не можете використовувати будь-які вбудовані модулі або бібліотеки, які розпізнають форми, або будь-яку іншу функцію, яка робить це завдання тривіальним.
  • Поверніть або роздрукуйте 2 цілих числа з підрахунками кіл і прямокутників.

Приклад 1

Приклад 1

Відповідь: 3 4

Приклад 2:

введіть тут опис зображення

Відповідь: 4 13

Це виклик для гольфу з кодом, тому виграє найкоротша програма або функція кожною мовою.


Я вже можу сказати, що підрахунок прямокутника буде стосуватися підрахунку кутів. Хоча круги будуть набагато складнішими.
Балінт

Відповіді:


3

PHP - 355 байт

Кількість байтів не включає '<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;}

У двох тестових випадках використані URL-адреси є http://i.stack.imgur.com/qnIFk.pngі http://i.stack.imgur.com/HV9k3.png.

Підраховує горизонтальні лінії та ділиться на дві, щоб отримати кількість фігур. Зауважує, що кола мають більш короткі горизонтальні відрізки, а прямокутники - довші горизонтальні відрізки.

Допущений хак, не гарантовано працювати ні на що, крім тестових випадків!

Я намагався обертати зображення на ± 45 ° і виявляти горизонтальні лінії. Це було б еквівалентом перевірки діагональних ліній і краще підібрало б кола, але я не зміг знайти алгоритм інтерполяції, який залишив би достатньо чисті краї для роботи. Наприклад, вони можуть розмазати лінію в два ряди пікселів і зіпсувати кількість рахунків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.