Chute-A-Pearing

16

Voici cinq images de poires et d'une goulotte en acier :

A: B: C: D: E:poires A poires B poires C poires D poires E

Ce ne sont que des vignettes, cliquez dessus pour les agrandir!

(J'ai fait ça avec Algodoo .)

Cette classe d'images a toujours les propriétés suivantes:

  1. Ils sont toujours 400 × 400 pixels avec un fond blanc. (Il peut ne pas être exactement blanc car les images SE sont compressées avec perte.)
  2. Ils ont 1 à 4 poires identiques, chacune tournée et positionnée (presque) de n'importe quelle façon.
  3. Ils ont une goulotte verticale en acier qui atteint le bas de l'image.
  4. Autre que le fond de la goulotte, la goulotte et les boîtes de délimitation de poire ( exemple de boîte de délimitation ) ne touchent ni ne sortent jamais des limites de l'image.
  5. Les boîtes englobantes des poires ne se chevauchent jamais ni ne chevauchent la goulotte.
  6. Les poires peuvent être sous la partie inclinée de la goulotte, comme en B , C et D . (Ainsi, la boîte englobante de la goulotte peut chevaucher la boîte englobante d'une poire.)
  7. La goulotte peut avoir n'importe quelle position horizontale et verticale tant qu'il y a suffisamment de place pour que toutes les boîtes de délimitation des poires puissent s'ajuster librement au-dessus (aucun cas "à peine ajusté" ne sera testé) et qu'une partie de la partie de colonne est visible.

Défi

Écrivez un programme qui prend une telle image et produit une autre image 400 × 400 avec la goulotte au même endroit, mais avec les poires repositionnées de sorte qu'elles soient toutes au-dessus de la goulotte (afin qu'elles puissent y tomber et être pressées et ainsi de suite).

Les exigences pour l'image de sortie sont:

  1. Toutes les poires de l'image d'entrée doivent être repositionnées de sorte qu'elles soient au-dessus de la goulotte, entre les bords gauche et droit de son entonnoir. (Au-dessus d'un bord n'est pas correct.)
  2. Chaque poire doit conserver son angle de rotation. (Vous devriez donc couper et coller les poires, pas les redessiner.)
  3. Les poires ne doivent pas se chevaucher ni se toucher ni la goulotte. (La poire boîtes de délimitation de peuvent cependant se chevaucher.)
  4. Les poires ne doivent pas toucher ni sortir des limites de l'image.

Voici des exemples de sorties valides pour les cinq exemples d'images:

A: B: C: D: E:sur A out B out C sur D sur D

Ce ne sont que des vignettes, cliquez dessus pour les agrandir!

Notez que l'image d'entrée pour E était déjà une sortie valide, mais réorganiser les poires lorsqu'elles ne sont pas techniquement nécessaires est très bien.

Détails

  • Prenez le nom de fichier de l'image ou les données d'image brutes via stdin / ligne de commande / appel de fonction.
  • Exportez l'image dans un fichier avec le nom de votre choix ou exportez les données brutes du fichier image vers stdout ou affichez simplement l'image.
  • Tout format de fichier d'image sans perte commun peut être utilisé.
  • Des graphiques et des bibliothèques d'images peuvent être utilisés.
  • Quelques pixels incorrects ici et là (en raison d'une perte ou de quelque chose) ne sont pas un gros problème. Si je ne peux pas dire que quelque chose ne va pas visuellement, alors ça va probablement.

Le code le plus court en octets gagne. Tiebreaker est le poste le plus voté.

Loisirs de Calvin
la source
Étant donné que j'ai un compte Khan Academy, et que cela semble parfait à résoudre, puis-je le résoudre sur Khan Academy? Il n'y a qu'une seule complication: les images externes ne sont pas autorisées. Heureusement, je peux exécuter les images à travers cela pour les convertir en données compatibles avec Khan Academy. Est-ce acceptable?
BobTheAwesome
@BobTheAwesome Vous souhaitez donc publier une réponse JavaScript? C'est bien, bien qu'il soit censé entrer et sortir des images 400x400. Vous pouvez poster votre travail pour montrer comment vous l'avez fait avec KA mais je ne peux pas l'accepter comme gagnant s'il ne fonctionne pas sur des images 400x400.
Calvin's Hobbies
Une parfaite coïncidence; Il se trouve que Khan Academy a par défaut un canevas 400x400px pour Javascript + Pjs.
BobTheAwesome
Non!! Imagenator est super lent sur les images 400x400 !!
BobTheAwesome

Réponses:

6

Python 2.7, 636 octets

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

ÉDITER : supprime maintenant le canal alpha avant de manipuler l'image et aligne les poires sur plusieurs lignes si nécessaire

Images produites:

UNE B C D et E

et avec des poires verticales (cela prend environ 3 minutes sur mon ordinateur):

cas de test verticale

diète
la source
1
Les images sont-elles antérieures / postérieures? Si oui, je pense que vous avez pris les mauvais pour BE ...
Sp3000
l'image d'entrée à gauche et les images de sortie à droite ... elles ne sont pas du tout parfaites en pixels en raison du redimensionnement et du copier-coller, je les ai juste mis pour donner des indications sur le fonctionnement du script ..
dieter
Est-ce que cela fonctionnera si toutes les poires sont horizontales ?
Calvin's Hobbies
en fait non ... pour deux raisons: elle tombe dans une boucle infinie car cette image particulière a un canal alpha -> fixant le script pour qu'il convertisse l'image en premier. L'autre raison pour laquelle j'ai supprimé le code qui aligne les poires sur plusieurs rangées -> le remettre
dieter