В этом конкурсе вы должны написать программу, которая принимает черно-белое пиксельное изображение и пытается изменить его так, чтобы белая фигура формировала звездный домен с минимальным количеством изменений.
Допустимые изменения превращают белые пиксели в черные и превращают черные пиксели в белые.
Выходные данные должны снова состоять из того же изображения, но на этот раз со всеми изменениями и отмеченным / центром. Пиксели, которые были изменены с белого на черный, должны отображаться синим цветом, те, которые были изменены с черного на белый, должны отображаться желтым, и по крайней мере один центральный пиксель должен отображаться красным. (Точные цвета на ваше усмотрение.) Программа должна выводить указанное изображение, а также общее количество внесенных изменений.
Определения
Звездный Домен
Набор белых пикселей изображения представляет звездный домен, если (и только если) есть (по крайней мере) один центральный пиксель . Центральный пиксель - это один из белых пикселей, который можно соединить прямой линией со всеми остальными белыми пикселями, чтобы эта линия проходила только через белые пиксели. (Центральный пиксель поэтому не обязательно уникален.)
Прямая линия между двумя пикселями
Учитывая два пикселя (начало и конец, оба красного цвета на иллюстрации ниже), прямая линия между двумя пикселями состоит из всех пикселей, которые касаются (математического, желтого на рисунке ниже) линии, которая ведет от центра первого пиксель к центру последнего пикселя. Пиксель не касается линии, если он касается только угла, поэтому для того, чтобы пиксель принадлежал линии пикселя, (математическая, желтая) линия должна пересекать рассматриваемый пиксель с ненулевой длиной. (Если он касается только угловой точки, это считается нулевой длиной). Рассмотрим следующие примеры:
пример
Первое изображение должно представлять пример тестового набора 'input', а два других изображения представляют два допустимых возможных выхода для данного примера:
Желтые области (ранее черные) также учитываются в «белой» области, в то время как синие области (ранее белые) учитываются в «черной» части вне домена, и красная точка каждый раз представляет один возможный центральный пиксель.
Тестовые случаи
Следующие тесты представляют собой png с размером 256 x 256 пикселей.
счет
Пожалуйста, запустите вашу программу со следующими тестовыми примерами и включите вывод (изображение / количество изменений) в ваш ответ. Я сделаю таблицу лидеров для каждого теста. Ваша оценка будет суммой каждого рейтинга в таблице лидеров - чем ниже оценка, тем лучше. Применяются стандартные лазейки. Запрещается заставлять программу распознавать эти тестовые случаи и запускать для них специальный случай. (Не разрешается предварительно вычислять и сохранять оптимальные центральные пиксели для каждого из этих тестовых случаев.) Программа должна работать для любых изображений.
Leaderboard
Name | Score | 1 - rk | 2 - rk | 3 - rk | 4 - rk | 5 - rk | 5 - rk | Total Changes
------------+-------+------------+------------+------------+------------+------------+------------+--------------
Maltysen | 11 | 28688 - 2 | 24208 - 2 | 24248 - 1 | 7103 - 2 | 11097 - 2 | 13019 - 2 | 108363
TheBestOne | 7 | 0 - 1 | 13698 - 1 | 24269 - 2 | 103 - 1 | 5344 - 1 | 4456 - 1 | 47867
Ответы:
Java 8, всего 47 867 изменений.
Использует среднее значение изображения в качестве центральной точки. Затем он рисует все возможные лучи в центр и дает ему лучший радиус для окраски. Затем все недопустимые точки окрашиваются в черный цвет.
Результаты
Изображение 1 - 0 изменений, Изображение 2 - 13 698 изменений
Изображение 3 - 24 269 изменений, Изображение 4 - 103 изменений
Изображение 5 - 5 344 изменения, Изображение 6 - 4 456 изменений
Без удаления недопустимых пикселей, всего 42,782 изменений
Зеленые пиксели - это первый слой недопустимых пикселей.
Изображение 1 - 0 изменений, Изображение 2 - 9,889 изменений
Изображение 3 - 24 268 изменений, Изображение 4 - 103 изменений
Изображение 5 - 4 471 изменений, Изображение 6 - 4 050 изменений
Все белые пиксели на всех изображениях могут иметь линию, нарисованную на них от центрального пикселя, если линия должна начинаться / заканчиваться не в центрах, а в любом месте на пикселе.
args[0]
содержит имя входного файла.args[1]
содержит имя выходного файла.Печать на
stdout
количество изменений.источник
Python - PIL - всего
216228108363 измененийОго! Сократите его пополам благодаря @AJMansfield! Этот алгоритм пропускает все заботы о вычислениях строк и оптимизации, а что нет.
Он просто меняет все белые на черный, кроме одного. Если белых нет, то черный становится белым.Он проверяет, есть ли больше белых или черных, и заменяет на него все остальные, кроме одного. Если черных нет, это делает (0, 0) центром.Результаты
Изображение 1 - 28688 изменений, Изображение 2 - 24208 изменений
Изображение 3 - 24248 изменений, Изображение 4 - 7103 изменений
Изображение 5 - 11097 изменений, Изображение 6 - 13019 изменений
Берет имя файла из raw_input и записывает в out.png и печатает количество изменений.
источник