Chute-A-pearing


16

Ecco cinque immagini di pere e uno scivolo d' acciaio :

A: B: C: D: E:pere A pere B pere C pere D pere E

Queste sono solo miniature, fai clic per ingrandirle!

( Li ho fatti con Algodoo .)

Questa classe di immagini ha sempre le seguenti proprietà:

  1. Sono sempre 400 × 400 pixel con uno sfondo bianco. (Potrebbe non essere esattamente bianco poiché le immagini SE sono compressi in modo perdita.)
  2. Hanno da 1 a 4 pere identiche, ciascuna ruotata e posizionata in (quasi) in qualsiasi modo.
  3. Hanno uno scivolo d'acciaio verticale che arriva fino alla parte inferiore dell'immagine.
  4. A parte la parte inferiore dello scivolo, lo scivolo e le scatole di delimitazione a pera ( esempio del riquadro di delimitazione ) non toccano né escono mai dai limiti dell'immagine.
  5. Le scatole di delimitazione delle pere non si sovrappongono mai né si sovrappongono allo scivolo.
  6. Le pere possono essere sotto la parte inclinata del scivolo, come in B , C , e D . (Quindi la scatola di delimitazione dello scivolo può sovrapporsi alla scatola di delimitazione di una pera.)
  7. Lo scivolo può avere qualsiasi posizione orizzontale e verticale purché vi sia spazio sufficiente per consentire a tutte le scatole di delimitazione delle pere di adattarsi liberamente al di sopra di essa (non verranno testate custodie "a malapena") e una parte della porzione di colonna è visibile.

Sfida

Scrivi un programma che includa tale immagine e produca un'altra immagine 400 × 400 con lo scivolo nello stesso posto, ma con le pere riposizionate in modo che siano tutte al di sopra dello scivolo (in modo che possano cadere in esso e essere spremute e quant'altro).

I requisiti per l'immagine di output sono:

  1. Tutte le pere nell'immagine in ingresso devono essere riposizionate in modo tale da trovarsi al di sopra dello scivolo, tra il bordo sinistro e destro del suo imbuto. (Sopra un bordo non è ok.)
  2. Ogni pera deve mantenere il proprio angolo di rotazione. (Quindi dovresti tagliare e incollare le pere, non ridisegnarle.)
  3. Le pere non devono sovrapporsi o toccarsi o scivolare. (Tuttavia, le scatole perimetrali a pera possono sovrapporsi.)
  4. Le pere non devono toccare o uscire dai limiti dell'immagine.

Ecco alcuni esempi di output validi per le cinque immagini di esempio:

A: B: C: D: E:fuori A fuori B fuori C fuori D fuori D

Queste sono solo miniature, fai clic per ingrandirle!

Si noti che l'immagine di input per E era già un output valido, ma riorganizzare le pere quando non tecnicamente necessario va bene.

Dettagli

  • Prendi il nome file dell'immagine o i dati dell'immagine grezza tramite stdin / riga di comando / chiamata di funzione.
  • Invia l'immagine a un file con il nome che preferisci o invia i dati del file di immagine grezza a stdout o visualizza semplicemente l'immagine.
  • È possibile utilizzare qualsiasi formato di file immagine lossless comune.
  • È possibile utilizzare librerie di immagini e grafica.
  • Alcuni pixel errati qua e là (a causa di perdita o qualcosa del genere) non sono un grosso problema. Se non riesco a dire che qualcosa non va visivamente, probabilmente va bene.

Vince il codice più breve in byte. Tiebreaker è il post più votato.


Dal momento che ho un account Khan Academy e questo sembra perfetto da risolvere lì, posso risolverlo su Khan Academy? C'è solo una complicazione: le immagini esterne non sono consentite. Fortunatamente posso far scorrere le immagini attraverso questo per convertirle in dati compatibili con Khan Academy. È accettabile?
BobTheAwesome

@BobTheAwesome Quindi vuoi pubblicare una risposta JavaScript? Va bene, anche se si suppone che input e output di immagini 400x400. Puoi pubblicare il tuo lavoro per mostrare come hai fatto con KA, ma potrei non accettarlo come vincitore se non funziona su immagini 400x400.
Calvin's Hobbies,

Una coincidenza perfetta; Khan Academy ha appena un default di un canvas 400x400px per Javascript + Pjs.
BobTheAwesome

No!! Imagenator è super lento su immagini 400x400 !!
BobTheAwesome

Risposte:


6

Python 2.7, 636 byte

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

MODIFICA : ora rimuove il canale alfa prima di gestire l'immagine e, se necessario, allinea le pere su più file

Immagini prodotte:

UN B C D ed E

e con le pere verticali (impiega circa 3 minuti sul mio computer):

testcase verticale


1
Le immagini sono prima / dopo? Se è così, penso che tu abbia preso quelli sbagliati per BE ...
Sp3000,

immagine di input a sinistra e immagini di output a destra ... non sono affatto pixel perfetti a causa del ridimensionamento e del copia-incolla, li ho messi solo per dare suggerimenti su come funziona lo script ..
Dieter


in realtà no ... per due motivi: rientra in un ciclo infinito perché questa particolare immagine ha un canale alfa -> correggendo lo script in modo che converta prima l'immagine. L'altro motivo per cui ho rimosso il codice che allinea le pere su più file -> rimettendolo
dieter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.