Chute-A-Pearing

16

Aqui estão cinco imagens de peras e uma calha de aço :

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

Estas são apenas miniaturas, clique nelas para ampliar!

(Eu fiz isso com Algodoo .)

Essa classe de imagens sempre tem as seguintes propriedades:

  1. Eles são sempre 400 × 400 pixels com fundo branco. (Pode não ser exatamente branco, pois as imagens do SE são compactadas com perdas.)
  2. Eles têm 1 a 4 peras idênticas, cada uma girada e posicionada (quase) de qualquer maneira.
  3. Eles têm uma calha de aço vertical que chega à parte inferior da imagem.
  4. Além da parte inferior da rampa, as caixas delimitadoras da rampa e da pera ( exemplo da caixa delimitadora ) nunca tocam ou saem dos limites da imagem.
  5. As caixas delimitadoras das peras nunca se sobrepõem nem se sobrepõem à calha.
  6. As pêras podem ser por baixo da parte inclinada da calha, como em B , C , e D . (Portanto, a caixa delimitadora da rampa pode se sobrepor à caixa delimitadora de uma pera.)
  7. A rampa pode ter qualquer posição horizontal e vertical, desde que haja espaço suficiente para que todas as caixas delimitadoras das peras se encaixem livremente acima dela (não serão testadas caixas "que mal se encaixam") e parte da parte da coluna é visível.

Desafio

Escreva um programa que capte essa imagem e produza outra imagem de 400 × 400 com a rampa no mesmo lugar, mas com as peras reposicionadas para que fiquem todas acima da rampa (para que elas possam cair nela e ser espremidas e assim por diante).

Os requisitos para a imagem de saída são:

  1. Todas as peras na imagem de entrada devem ser reposicionadas de forma que fiquem acima da rampa, entre as bordas esquerda e direita do funil. (Acima de uma aresta não está ok.)
  2. Cada pera deve manter seu ângulo de rotação. (Portanto, você deve cortar e colar as peras, não redesenhá-las.)
  3. As peras não devem se sobrepor ou tocar uma na outra ou na rampa. (As caixas delimitadoras de pera podem se sobrepor.)
  4. As peras não devem tocar ou sair dos limites da imagem.

Aqui estão exemplos de saídas válidas para as cinco imagens de amostra:

A: B: C: D: E:fora A fora B fora C fora D fora D

Estas são apenas miniaturas, clique nelas para ampliar!

Observe que a imagem de entrada para E já era uma saída válida, mas reorganizar as peras quando não for tecnicamente necessário é bom.

Detalhes

  • Pegue o nome do arquivo da imagem ou os dados brutos da imagem via stdin / linha de comando / chamada de função.
  • Envie a imagem para um arquivo com o nome de sua escolha ou envie os dados brutos do arquivo de imagem para stdout ou simplesmente exiba a imagem.
  • Qualquer formato de arquivo de imagem sem perdas comum pode ser usado.
  • Podem ser usadas bibliotecas de gráficos e imagens.
  • Alguns pixels incorretos aqui e ali (devido a perdas ou algo assim) não é grande coisa. Se eu não posso dizer que algo está errado visualmente, provavelmente está tudo bem.

O código mais curto em bytes vence. O desempate é o posto mais votado.

Passatempos de Calvin
fonte
Como tenho uma conta na Khan Academy, e isso parece perfeito para ser resolvido lá, posso resolvê-lo na Khan Academy? Há apenas uma complicação: imagens externas não são permitidas. Felizmente, posso executar as imagens através disso para convertê-las em dados amigáveis ​​da Khan Academy. Isso é aceitável?
BobTheAwesome
@BobTheAwesome Então você quer postar uma resposta em JavaScript? Tudo bem, embora seja necessário inserir e gerar imagens de 400x400. Você pode postar seu trabalho para mostrar como você o fez com a KA, mas posso não aceitá-lo como vencedor se ele não funcionar em imagens de 400x400.
Hobbies de Calvin
Uma perfeita coincidência; Por acaso, a Khan Academy possui um padrão de uma tela de 400x400px para Javascript + Pjs.
BobTheAwesome
Não!! O Imagenator é super lento em imagens de 400x400 !!
BobTheAwesome

Respostas:

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

EDIT : agora remove o canal alfa antes de manipular a imagem e alinha as peras em várias linhas, se necessário

Imagens produzidas:

UMA B C D e E

e com peras verticais (leva cerca de 3 minutos no meu computador):

caso de teste vertical

dieter
fonte
11
As imagens são anteriores ou posteriores? Se então eu acho que você tenha tomado as erradas para ser ...
SP3000
entrada de imagem à esquerda e saída de imagens à direita ... elas não são perfeitas em pixels devido ao redimensionamento e à colagem de cópias, eu as coloquei apenas para dar dicas de como o script funciona ..
dieter
Isso funcionará se todas as peras forem horizontais ?
Calvin's Hobbies
na verdade não ... por duas razões: ele se encaixa em um loop infinito, porque essa imagem em particular possui um canal alfa -> corrigindo o script e convertendo a imagem primeiro. A outra razão é que eu removido o código que alinha as peras em várias linhas -> colocá-lo de volta
dieter