Это изображение было сделано путем наложения 7 разноцветных прямоугольников друг на друга:
Черный и бордовый прямоугольники свободны , то есть над ними нет никаких других прямоугольников.
Напишите программу, которая принимает изображение, подобное этому, и удаляет любой свободный прямоугольник, выводя полученное изображение.
пример
Если вы запустили свою программу на изображении выше и продолжали повторно запускать ее на выходе, она может развиваться следующим образом.
Прогон 1 - черные удалены (мог быть бордовым):
Прогон 2 - Maroon удален (только выбор):
Прогон 3 - Желтый удален (только выбор):
Прогон 4 - Синий удален (мог быть зеленым):
Прогон 5 - Зеленый удален (только выбор):
Прогон 6 - Браун удален (только выбор):
Прогон 7 - красный удален (только выбор):
Любые дополнительные прогоны должны давать одинаковое белое изображение.
Надеемся, что Stack Exchange не сжал без потерь ни одно из этих изображений.
Изображение всегда будет иметь белый фон, и каждый прямоугольник будет иметь уникальный цвет RGB, который не является белым.
Вы можете предположить, что изображение всегда можно интерпретировать как набор перекрывающихся прямоугольников. В частности, вы можете предположить, что для определенного цвета пиксель с этим цветом, ближайшим к верхней части изображения, является частью верхнего края прямоугольника этого цвета. То же самое относится к нижнему, левому и правому краям.
Так, например, на этом изображении верхний край красного прямоугольника будет чуть ниже нижнего края желтого прямоугольника, так как оранжевый прямоугольник покрывает старый красный верхний край:
На этом изображении красный прямоугольник может быть удален первым (наряду с черным / бордовым / оранжевым / серым):
Когда порядок нижних прямоугольников неоднозначен, вы можете дать им любой порядок.
Например, левое изображение здесь может стать средним или правым:
Вывод не должен иметь парадоксальных совпадений (поэтому возможно сделать это с помощью алгоритма художника ). Так что на этом изображении ( спасибо user23013 ), он должен быть зеленым под оранжевым прямоугольником:
дополнительные детали
- Изображение и прямоугольники могут иметь любые размеры.
- Прямоугольники могут касаться границы изображения.
- Может быть до 256 3 - 1 прямоугольника.
- Если вход полностью белый, то выход должен быть также.
- Вы можете использовать библиотеки изображений.
- Входными данными должны быть имя файла изображения или необработанные данные изображения. Это может быть из стандартного ввода или командной строки.
- Вывод может быть записан в тот же или другой файл изображения, выгружен сырым в стандартный вывод или просто отображен.
- Разрешен любой распространенный формат изображения без потерь цвета .
Представление с наименьшим количеством байтов выигрывает.
источник
Ответы:
CJam, 241 байт
(с удаленными символами новой строки.)
Он использует формат файла ppm. Пример использования (с использованием ImageMagick):
Ну, это слишком долго и слишком медленно ... Примерно за минуту.
Я изменил размеры тестовых случаев (и добавил некоторые другие), чтобы упростить тестирование.
Кажется, информация о цветовом пространстве теряется, поэтому цвета немного отличаются.
источник
Python,
690651610606594569 байтСкрипт читает имя изображения из стандартного ввода.
Он обнаруживает края каждого прямоугольника, сортирует их по количеству различных цветов, которые они содержат (свободные прямоугольники содержат только 1 цвет, а затем появляются в конце списка)
Этот список используется для перерисовки изображения. Порядок перерисовки определяется путем выбора перестановки списка, которая будет генерировать выходное изображение, которое имеет наименьшую разницу в пикселях по сравнению с входными данными.
источник
Java - 1483 байта
Я не большой гольфист кода, пусть это будет ясно; так что многословие не является полностью ошибкой Java ;-) Тем не менее, это казалось действительно забавным испытанием. Я решил это таким образом, что - я думаю - немного скучно и многословно, но эй. Это работает, это (относительно) быстро и, особенно, было весело!
Идея заключается в следующем: проверьте каждый пиксель, начиная с верхнего левого угла до самого нижнего правого. Это белый пиксель? Отбой. Это цветной? Круто, давайте отследим это и попробуем определить его границы (вверху слева, вверху справа, внизу слева, внизу справа).
Как только это будет сделано, проверьте область каждого прямоугольника. Содержит ли он цвет, отличный от цвета прямоугольника? Затем выясните, какой прямоугольник принадлежит этому цвету, и обновите z-индекс этого перекрывающегося прямоугольника на 1.
И, наконец, нарисуйте все прямоугольники, принимая во внимание z-индексы. На самом деле он работает как z-index, который вы знаете по CSS и другим 3D вещам. Прямоугольники с самым низким z-индексом рисуются первыми, а самый высокий z-индекс - последним.
Полный код, который немного - и это преуменьшение ;-) - написан более четко, можно найти здесь: http://pastebin.com/UjxUUXRp
Кроме того, теперь, когда я вижу подчинение Дитера, я мог бы упростить некоторые детали. Нет необходимости искать прямоугольник, цвет которого перекрывает другой прямоугольник. Я мог бы просто посчитать количество «вторгающихся» цветов.
источник