Chute-A-Pearing

16

Aquí hay cinco imágenes de peras y una rampa de acero :

A: B: C: D: E:peras A peras B peras C peras D peras E

Estas son solo miniaturas, ¡haz clic en ellas para agrandarlas!

(Hice esto con Algodoo ).

Esta clase de imágenes siempre tiene las siguientes propiedades:

  1. Siempre tienen 400 × 400 píxeles con un fondo blanco. (Puede que no sea exactamente blanco ya que las imágenes SE están comprimidas con pérdida).
  2. Tienen de 1 a 4 peras idénticas, cada una rotada y posicionada (casi) de cualquier manera.
  3. Tienen una rampa vertical de acero que llega hasta la parte inferior de la imagen.
  4. Aparte de la parte inferior de la rampa, la rampa y los cuadros delimitadores de pera ( ejemplo de cuadro delimitador ) nunca tocan ni salen de los límites de la imagen.
  5. Las cajas delimitadoras de las peras nunca se superponen entre sí ni se superponen a la rampa.
  6. Las peras pueden estar bajo la parte en pendiente de la tolva, como en B , C , y D . (Por lo tanto, el cuadro delimitador del conducto puede superponerse al cuadro delimitador de una pera).
  7. La rampa puede tener cualquier posición horizontal y vertical siempre que haya espacio suficiente para que todas las cajas delimitadoras de las peras se ajusten libremente por encima (no se probarán casos de "apenas ajustes") y parte de la parte de la columna es visible.

Desafío

Escriba un programa que tome esa imagen y genere otra imagen de 400 × 400 con la rampa en el mismo lugar, pero con las peras reposicionadas para que estén todas por encima de la rampa (para que puedan caer en ella y exprimirlas, etc.).

Los requisitos para la imagen de salida son:

  1. Todas las peras en la imagen de entrada deben reposicionarse de modo que estén sobre la rampa, entre el borde izquierdo y derecho de su embudo. (Por encima de un borde no está bien).
  2. Cada pera debe mantener su ángulo de rotación. (Por lo tanto, debe cortar y pegar las peras, no volver a dibujarlas).
  3. Las peras no deben solaparse ni tocarse entre sí ni con el conducto. (Sin embargo, los cuadros delimitadores de pera pueden superponerse).
  4. Las peras no deben tocar ni salir de los límites de la imagen.

Aquí hay ejemplos de salidas válidas para las cinco imágenes de muestra:

A: B: C: D: E:fuera A fuera B fuera C fuera D fuera D

Estas son solo miniaturas, ¡haz clic en ellas para agrandarlas!

Tenga en cuenta que la imagen de entrada para E ya era una salida válida, pero reorganizar las peras cuando no es técnicamente necesario está bien.

Detalles

  • Tome el nombre de archivo de la imagen o los datos de la imagen sin procesar a través de stdin / línea de comando / llamada a función.
  • Envíe la imagen a un archivo con el nombre de su elección o envíe los datos del archivo de imagen sin procesar a stdout o simplemente muestre la imagen.
  • Se puede utilizar cualquier formato de archivo de imagen sin pérdida común.
  • Se pueden usar bibliotecas de gráficos e imágenes.
  • Unos pocos píxeles incorrectos aquí y allá (debido a la pérdida o algo así) no es gran cosa. Si no puedo decir que algo está mal visualmente, entonces probablemente esté bien.

El código más corto en bytes gana. Tiebreaker es la publicación más votada.

Pasatiempos de Calvin
fuente
Dado que tengo una cuenta de Khan Academy, y esto parece perfecto para resolver allí, ¿puedo resolverlo en Khan Academy? Solo hay una complicación: no se permiten imágenes externas. Afortunadamente, puedo pasar las imágenes a través de esto para convertirlas en datos amigables de Khan Academy. ¿Es esto aceptable?
BobTheAwesome
@BobTheAwesome ¿Desea publicar una respuesta de JavaScript? Eso está bien, aunque se supone que debe ingresar y emitir imágenes de 400x400. Puede publicar su trabajo para mostrar cómo lo hizo con KA, pero es posible que no lo acepte como ganador si no funciona en imágenes de 400x400.
Hobbies de Calvin
Una coincidencia perfecta De hecho, Khan Academy tiene un valor predeterminado de un lienzo de 400x400px para Javascript + Pjs.
BobTheAwesome
¡¡No!! ¡Imagenator es súper lento en imágenes de 400x400!
BobTheAwesome

Respuestas:

6

Python 2.7, 636 bytes

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

EDITAR : ahora elimina el canal alfa antes de manejar la imagen y alinea las peras en varias filas si es necesario

Imágenes producidas:

UN si C D y E

y con peras verticales (toma alrededor de 3 minutos en mi computadora):

caso de prueba vertical

dieter
fuente
1
¿Son las imágenes antes / después? Si es así, creo que has tomado los equivocados para BE ...
Sp3000
la imagen de entrada a la izquierda y las imágenes de salida a la derecha ... no son perfectas para píxeles debido al cambio de escala y el copiado, las puse solo para dar pistas sobre cómo funciona el script ...
dieter
¿Funcionará si todas las peras son horizontales ?
Calvin's Hobbies
en realidad no ... por dos razones: cae en un bucle infinito porque esta imagen en particular tiene un canal alfa -> arreglando el script para que convierta la imagen primero. La otra razón es que eliminé el código que alinea las peras en varias filas -> poniéndolo de nuevo
dieter