溜槽


16

这是梨和 溜槽的五幅图像:

A:B:C:D:E:梨A 梨B 梨C 梨D 梨E

这些只是缩略图,请单击它们以查看完整尺寸!

(我是用Algodoo制作的。)

此类图像始终具有以下属性:

  1. 它们始终是白色背景的400×400像素。(由于SE图像有损压缩,因此可能不是完全白色。)
  2. 它们有1至4个相同的梨,每个梨都以(几乎)任何方式旋转和定位。
  3. 他们有一个垂直的钢制斜槽,直达图像的底部。
  4. 除了滑槽的底部以外,滑槽和梨形边界框(例如边界框)永远不会触碰或超出图像边界。
  5. 梨的边界框永远不会相互重叠,也不会与斜槽重叠。
  6. 如在BCD中,梨可能在滑槽的倾斜部分下面。(因此,溜槽的边界框可能与梨的边界框重叠。)
  7. 溜槽可以有任何水平和垂直位置,只要有足够的空间让梨的所有包围盒自由地放置在其上即可(不会测试“几乎不适合”的情况),并且可以看到部分圆柱。

挑战

编写一个程序,获取这样的图像,并在相同的位置放置滑槽,再输出另一个400×400的图像,但是将梨重新放置,使它们都位于滑槽的上方(这样它们就可以掉入其中并被榨汁,没什么)。

输出图像的要求是:

  1. 输入图像中的所有梨都必须重新放置,以使其位于滑槽上方,漏斗左右边缘之间。(以上的边缘是正常。)
  2. 每个梨必须保持其旋转角度。(因此,您应该剪切和粘贴梨子,而不是重新绘制它们。)
  3. 梨不得重叠或彼此接触或与滑槽接触。(但是,梨形边框可能会重叠。)
  4. 梨不能触摸或超出图像范围。

以下是这五个样本图像的有效输出示例:

A:B:C:D:E:出A B出 出C D出 D出

这些只是缩略图,请单击它们以查看完整尺寸!

请注意,E的输入图像已经是有效的输出,但是在技术上不必要时重新排列梨就可以了。

细节

  • 通过stdin /命令行/函数调用获取图像的文件名或原始图像数据。
  • 将图像输出到具有您选择的名称的文件,或将原始图像文件数据输出到stdout或仅显示图像。
  • 可以使用任何常见的无损图像文件格式。
  • 可以使用图形和图像库。
  • 到处都有一些不正确的像素(由于有损或其他原因)并不重要。如果我无法从视觉上分辨出任何错误,那么可能就可以了。

以字节为单位的最短代码获胜。Tiebreaker是票数最高的职位。


既然我有可汗学院的帐户,并且似乎很适合在那里解决,我可以在可汗学院解决它吗?并发症只有一种:不允许使用外部图像。幸运的是,我可以通过来运行图像,以将其转换为可汗学院友好的数据。这可以接受吗?
BobTheAwesome

@BobTheAwesome因此,您想发布一个JavaScript答案吗?很好,尽管应该输入和输出400x400图像。您可以发布您的作品来展示您是如何使用KA制作的,但是如果它不能在400x400的图像上使用,我可能不会接受它作为赢家。
加尔文的爱好

完美的巧合;汗学院(Khan Academy)碰巧对Javascript + Pjs具有默认的400x400px画布。
BobTheAwesome

没有!!Imagenator在400x400图像上超级慢!
BobTheAwesome

Answers:


6

Python 2.7,636字节

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

编辑:现在在处理图像之前删除Alpha通道,并在必要时将梨对齐几行

产生的图像:

一种 乙 C D和E

和垂直梨(在我的计算机上大约需要3分钟):

测试用例 垂直


1
图像是前后的吗?如果是这样,我认为您选择了错误的BE ...
Sp3000 2015年

在左边,在右边输出图像输入图像......他们不是完美的像素都因缩放和复制粘贴,我已经把他们只是就如何脚本作品..提示
迪特尔

如果所有梨子都是水平的,这样行得通吗?
加尔文的爱好

实际上没有...有两个原因:由于特定的图像具有alpha通道,它陷入了无限循环->修复了脚本,因此它首先转换了图像。另一个原因是我删除了将梨对齐几行的代码->放回原处
Dieter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.