Чут-А-Пірінг


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:з A з Б з C з D з D

Це лише ескізи, натисніть їх на повний розмір!

Зауважте, що вхідне зображення для E вже було дійсним висновком, але перестановка груш, коли це технічно не потрібно, просто добре.

Деталі

  • Візьміть ім'я зображення або необроблені дані зображення за допомогою виклику stdin / командного рядка / функції.
  • Виведіть зображення у файл із обраним вами іменем або виведіть вихідні дані файлу зображення у stdout або просто виведіть зображення.
  • Може використовуватися будь-який загальний формат файлу зображень без втрат.
  • Можливо використовувати графіки та бібліотеки зображень.
  • Кілька невірних пікселів тут і там (через втрату чи щось) - не велика справа. Якщо я не можу візуально сказати що-небудь не так, це, мабуть, добре.

Виграє найкоротший код у байтах. Tierereaker - це найвище оцінений пост.


Оскільки у мене є акаунт в Академії Хана, і це здається ідеальним для вирішення там, чи можна це вирішити в Академії Хана? Є лише одне ускладнення: зовнішні зображення заборонені. На щастя, я можу запустити зображення через це, щоб перетворити їх на зручні для Академії дані. Це прийнятно?
BobTheAwesome

@BobTheAwesome Отже, ви хочете опублікувати відповідь на JavaScript? Це добре, хоча передбачається вводити та виводити зображення 400х400. Ви можете опублікувати свою роботу, щоб показати, як ви це зробили з KA, але я не можу прийняти її як переможця, якщо вона не працює на зображеннях 400x400.
Хобі Кальвіна

Ідеальний збіг; Академія Хана так само має типовий полотно 400x400px для Javascript + Pjs.
BobTheAwesome

Ні!! Imagenator дуже повільний на 400х400 зображеннях !!
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()

EDIT : тепер видаляє альфа-канал перед тим, як обробляти зображення, і вирівнює груші на кілька рядів, якщо потрібно

Зроблені зображення:

А Б С Д і Е

і з вертикальними грушами (на моєму комп’ютері займає близько 3 хвилин):

вивірка вертикальний


1
Чи є зображення до / після? Якщо так, я думаю, що ви прийняли неправильні для BE ...
Sp3000

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


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