Желоб-А-Pearing


16

Вот пять изображений груш и стальной желоб :

A: B: C: D: E:груши А груши Б груши С груши D груши Е

Это всего лишь миниатюры, кликните на них для просмотра в полном размере!

(Я сделал это с Algodoo .)

Этот класс изображений всегда имеет следующие свойства:

  1. Они всегда 400 × 400 пикселей с белым фоном. (Он может быть не совсем белым, поскольку изображения SE сжимаются с потерями.)
  2. У них от 1 до 4 одинаковых груш, каждая вращается и позиционируется (почти) любым способом.
  3. У них есть один вертикальный стальной желоб, который достигает нижней части изображения.
  4. За исключением нижней части желоба, желоба и ограничивающих рамок для груши ( пример ограничительной рамки) ) никогда не касаются и не выходят за границы изображения.
  5. Ограничительные рамки груш никогда не перекрывают друг друга и не перекрывают желоб.
  6. Груши могут находиться под наклонной частью желоба, как в B , C и D . (Таким образом, ограничительная коробка желоба может перекрывать ограничительную коробку груши.)
  7. Желоб может иметь любое горизонтальное и вертикальное положение при условии, что имеется достаточно места для того, чтобы все ограничивающие рамки груш свободно помещались над ним (не будут проверяться «едва подходящие» случаи), и часть участка колонны видна.

Вызов

Напишите программу, которая берет такое изображение и выводит еще одно изображение размером 400 × 400 с желобом в том же месте, но с расположенными в нем грушами, так что все они находятся над желобом (чтобы они могли упасть в него и сока и тому подобное).

Требования к выходному изображению:

  1. Все груши на входном изображении должны быть расположены таким образом, чтобы они находились над желобом, между левым и правым краем его воронки. (Над краем не в порядке.)
  2. Каждая груша должна поддерживать угол поворота. (Так что вы должны резать и вставлять груши, а не перерисовывать их.)
  3. Груши не должны пересекаться или касаться друг друга или желоба. (Груша ограничивающая коробки могут пересекаться все же.)
  4. Груши не должны касаться или выходить за границы изображения.

Вот примеры допустимых выходных данных для пяти образцов изображений:

A: B: C: D: E:вне А вне B вне C вне D вне D

Это всего лишь миниатюры, кликните на них для просмотра в полном размере!

Обратите внимание, что входное изображение для E уже было допустимым, но перестановка груш, когда в этом нет технической необходимости, просто отлично.

Детали

  • Возьмите имя файла изображения или необработанные данные изображения через стандартный ввод / командную строку / вызов функции.
  • Выведите изображение в файл с выбранным вами именем или выведите исходные данные файла изображения на стандартный вывод или просто отобразите изображение.
  • Можно использовать любой общий формат файла изображения без потерь.
  • Графические и графические библиотеки могут быть использованы.
  • Несколько неправильных пикселей здесь и там (из-за потери или чего-то еще) не имеют большого значения. Если я не могу сказать, что что-то не так визуально, тогда, вероятно, все в порядке.

Самый короткий код в байтах побеждает. Tiebreaker является самым высоко оцененным постом.


Так как у меня есть учетная запись в Академии хана, и, кажется, это идеально подходит для ее решения, могу ли я решить ее в Академии хана? Есть только одно осложнение: внешние изображения не допускаются. К счастью, я могу управлять изображениями через это, чтобы преобразовать их в данные Академии Хана. Это приемлемо?
BobTheAwesome

@BobTheAwesome Итак, вы хотите опубликовать ответ JavaScript? Это нормально, хотя предполагается вводить и выводить изображения размером 400x400. Вы можете опубликовать свою работу, чтобы показать, как вы это сделали с KA, но я не могу принять ее как победителя, если она не работает с изображениями 400x400.
Увлечения Кэлвина

Идеальное совпадение; В Академии Кхана для Javascript + Pjs по умолчанию используется холст размером 400x400 пикселей.
BobTheAwesome

Нет !! Imagenator очень медленный на изображениях 400x400!
BobTheAwesome

Ответы:


6

Python 2,7, 636 байт

import sys;from PIL.Image import*
_,m,R,I,p,H=255,400,range,open(sys.argv[1]).convert('RGB'),[],0
w,h=I.size;W,A,P,L=(_,_,_),[(x,y)for x in R(w)for y in R(h)],I.load(),I.copy()
try:
 while 1:
    s,x,y,X,Y=[[a for a in A if P[a][0]<50][0]],m,m,0,0
    while s:c=(a,b)=s.pop();x,y,X,Y=min(x,a),min(y,b),max(X,a),max(Y,b);P[c]=W;s+=[n for n in[(a+1,b),(a,b+1),(a-1,b),(a,b-1)]if n in A and P[n]!=W]
    p+=[((x,y,X,Y),X-x,Y-y)]
except:0
def G(a):r,g,b=P[a];return r==g==b and r<_
g=[a for a in A if G(a)]
(z,t),W=g[0],max([x for x,y in g]);t-=1
for r,w,h in p:
 if z+w>W:z,_=g[0];t-=H;H=0
 I.paste(L.crop(r),(z,t-h,z+w,t));z+=w;H=max(h,H)
I.show()

РЕДАКТИРОВАТЬ : теперь удаляет альфа-канал перед обработкой изображения и выравнивает груши в несколько рядов, если это необходимо

Произведенные изображения:

A В С D и E

и с вертикальными грушами (занимает около 3 минут на моем компьютере):

прецедент вертикальный


1
Изображения до / после? Если так, то я думаю, что вы приняли неправильные для BE ...
Sp3000

входное изображение слева и выходное изображение справа ... они не идеальны по пикселям из-за изменения масштаба и вставки копий, я поместил их просто для того, чтобы дать подсказки о том, как работает скрипт ..
dieter


на самом деле нет ... по двум причинам: он попадает в бесконечный цикл, потому что у этого конкретного изображения есть альфа-канал -> исправление сценария, поэтому сначала он преобразует изображение. Другая причина в том, что я удалил код, который выравнивает груши по нескольким строкам -> отложив его
dieter
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.