Chute-A-Pearing

16

Oto pięć zdjęć gruszek i stalowej rynny :

A: B: C: D: E:gruszki A. gruszki B gruszki C gruszki D. gruszki E

To są tylko miniatury, kliknij je, aby wyświetlić w pełnym rozmiarze!

(Zrobiłem je z Algodoo .)

Ta klasa obrazów ma zawsze następujące właściwości:

  1. Są to zawsze 400 x 400 pikseli na białym tle. (Może nie być dokładnie biały, ponieważ obrazy SE są kompresowane stratnie).
  2. Mają od 1 do 4 identycznych gruszek, każda obrócona i ustawiona w (prawie) dowolny sposób.
  3. Mają jedną pionową stalową rynnę, która sięga do dolnej części obrazu.
  4. Inne niż dolna część rynny, rynna i gruszka obwiedni ( przykład obwiedni ) nigdy nie dotykają ani nie wychodzą poza granice obrazu.
  5. Obwiednie gruszek nigdy nie zachodzą na siebie ani nie nachodzą na rynnę.
  6. Gruszki może znajdować się pod nachyloną część rynny, tak jak w B , C i D . (Tak więc obwiednia rynny może zachodzić na obwiednię gruszki.)
  7. Rynna może mieć dowolne położenie poziome i pionowe, o ile jest wystarczająco dużo miejsca, aby wszystkie obwiednie gruszek mogły swobodnie się nad nią zmieścić (nie będą testowane skrzynie „ledwo pasujące”), a część kolumny będzie widoczna.

Wyzwanie

Napisz program, który pobiera taki obraz i wyprowadza kolejny obraz 400 × 400 z rynną w tym samym miejscu, ale z ustawionymi gruszkami tak, aby wszystkie znajdowały się nad rynną (aby mogły w nią wpaść i zostać wyciśnięte i tak dalej).

Wymagania dla obrazu wyjściowego są następujące:

  1. Wszystkie gruszki na obrazie wejściowym muszą zostać ustawione w taki sposób, aby znajdowały się nad rynną, między lewą i prawą krawędzią lejka. (Powyżej krawędzi nie jest w porządku.)
  2. Każda gruszka musi zachować kąt obrotu. (Więc powinieneś przecinać i wklejać gruszki, a nie przerysowywać je.)
  3. Gruszki nie mogą zachodzić na siebie ani dotykać się ani rynny. ( Obramowania gruszy mogą się jednak nakładać).
  4. Gruszki nie mogą dotykać ani wychodzić poza granice obrazu.

Oto przykłady prawidłowych wyników dla pięciu przykładowych obrazów:

A: B: C: D: E:poza A poza B poza C poza D. poza D.

To są tylko miniatury, kliknij je, aby wyświetlić w pełnym rozmiarze!

Zauważ, że obraz wejściowy dla E był już prawidłowym wyjściem, ale zmiana kolejności gruszek, gdy nie jest to technicznie konieczne, jest w porządku.

Detale

  • Weź nazwę pliku obrazu lub dane surowego obrazu za pomocą stdin / wiersza poleceń / wywołania funkcji.
  • Wyślij obraz do pliku o wybranej nazwie lub wyślij surowe dane pliku obrazu na standardowe wyjście lub po prostu wyświetl obraz.
  • Można użyć dowolnego popularnego formatu plików bezstratnych.
  • Można stosować biblioteki grafiki i obrazów.
  • Kilka niepoprawnych pikseli tu i tam (z powodu straty lub czegoś) nie jest wielkim problemem. Jeśli nie mogę powiedzieć, że coś jest nie tak wizualnie, to prawdopodobnie jest w porządku.

Najkrótszy kod w bajtach wygrywa. Tiebreaker to najwyżej oceniany post.

Hobby Calvina
źródło
Ponieważ mam konto w Khan Academy i wydaje się, że jest to idealne rozwiązanie, czy mogę je rozwiązać w Khan Academy? Jest tylko jedna komplikacja: obrazy zewnętrzne są niedozwolone. Na szczęście mogę przez to przeglądać obrazy, aby przekonwertować je na dane przyjazne Khan Academy. Czy to jest dopuszczalne?
BobTheAwesome
@BobTheAwesome Więc chcesz opublikować odpowiedź JavaScript? W porządku, chociaż ma to na celu wprowadzanie i wyprowadzanie obrazów 400 x 400. Możesz opublikować swoją pracę, aby pokazać, jak to zrobiłaś z KA, ale mogę nie zaakceptować jej jako zwycięzcy, jeśli nie będzie działać na obrazach 400 x 400.
Calvin's Hobbies
Idealny zbieg okoliczności; Tak się składa, że ​​Khan Academy ma domyślnie płótno 400x400px dla Javascript + Pjs.
BobTheAwesome
Nie!! Imagenator działa bardzo wolno na obrazach 400 x 400 !!
BobTheAwesome

Odpowiedzi:

6

Python 2.7, 636 bajtów

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()

EDYCJA : teraz usuwa kanał alfa przed obsługą obrazu i wyrównuje gruszki w kilku rzędach, jeśli to konieczne

Wyprodukowane obrazy:

ZA b do D i E.

oraz z pionowymi gruszkami (zajmuje to około 3 minut na moim komputerze):

testcase pionowy

dieter
źródło
1
Czy obrazy były wcześniej / później? Jeśli tak, to myślę, że wybrałeś niewłaściwe dla BE ...
Sp3000
obraz wejściowy po lewej stronie, a obraz wyjściowy po prawej ... nie są wcale pikselowe ze względu na przeskalowanie i wklejanie kopii, umieściłem je tylko po to, aby podpowiedzieć, jak działa skrypt ...
dieter
Czy to zadziała, jeśli wszystkie gruszki będą w pozycji poziomej ?
Calvin's Hobbies
właściwie nie ... z dwóch powodów: wpada w nieskończoną pętlę, ponieważ ten konkretny obraz ma kanał alfa -> naprawia skrypt, aby najpierw przekonwertować obraz. Innym powodem jest to, że usunąłem kod, który wyrównuje gruszki w kilku rzędach -> odkładając go z powrotem
dieter