将图片变成拼图


14

摘要

这项挑战的目标是创建一个15拼图 / 滑动拼图(在法语中也称为taquin)的未还原图像版本。

细节:

给定一个输入,该输入包括:

  • 一个图像,
  • 的整数n
  • 的其它整数r

您的程序,函数或任何其他适合的东西,都必须输出与输入相同的图像(即,相同的大小和格式),但是必须经过以下过程:

  1. 将图像分成矩形,
  2. 随机删除其中一个矩形,
  3. 从受点(2.)影响的线/列中移动任意数量的连续矩形,以便填充创建的孔,并在该线/列中生成另一个。0如果毛坯在角落或边缘,则此数字可以是。

重复(3.)r次。

说明:

  • 如果您在第(3.)步中从行中移动了矩形,则必须在下一个重复中从列中移动矩形,
  • 如果您在一行中从左到右移动矩形,则必须在下一行中将它们从右到左移动,这与列的上下到上下以及从下到上相同,
  • 您可能会假设n会选择该选项,因此它将划分图片两边的长度。

最后一点:

动画.gif演示整个过程非常受欢迎。

我建议使用下面的图片(是1024x768),将n=16r=100用作模型,您可以使用任何其他图片(只要它是相关的并且符合SE的规则)。

请注意,适用标准漏洞政策

这是,因此较短的提交将获胜!

狗,猫和鸭的爱好者应该感到满意!

由于请求了一个示例,因此这里有一个“手工制作”的示例,其中包含n=4r=1

步骤1和2

在此处输入图片说明

步骤3:逐行,向左2个矩形

在此处输入图片说明


该示例建议这些矩形不必具有相同的大小,不需要覆盖整个图像,并且应包括在原始图像上绘制的线。您可以通过更改规格或示例来澄清这一点吗?
trichoplax

@trichoplax:该示例是手工绘制的,具有绘画性和快速性。我会正确地重做。
弗雷德里克

@trichoplax:我必须承认我并没有完全理解你的观点,但是并不需要此开头的行来理解挑战,所以我认为保持它毫无用处。
弗雷德里克

move a random number of contiguous rectangles可以是0个矩形吗?(当空白处在边缘/角落时,使程序更改行为会很痛苦)
JungHwan Min

@JungHwanMin:是的。好的话,谢谢!
弗雷德里克

Answers:


10

Mathematica,246个字节

ImageAssemble@(n=Nest)[k=RandomInteger;q=Reverse;({t,r}=1~k~2;q[o=n[q/@#&,#,r]&@*(n[#&,#,t]&)])[o@#/.{a___,b:_~RepeatedNull~k[Position[o@#,i][[1,2]]-1],i,c___}:>{a,i,b,c}]&,MapAt[(i=#~ImageAdd~1)&,#~ImagePartition~Scaled[1/#2],{1,#2}~k~2],#3]&

匿名函数。包含U + F3C7,对应于Mathematica的Transpose运算符。此函数获取一个Image对象并返回一个Image对象。

动画示例,带有n=16r=100

经过5000次迭代:

在此处输入图片说明(点击图片查看大图)

说明

初始化

n=Nest

Nest功能(重复操作)存储在中n

k=RandomInteger;q=Reverse;

RandomInteger函数存储在中k,将函数存储在Reverseq

分割影像

#~ImagePartition~Scaled[1/#2]

将输入图像划分为(第二个输入)^ 2个图块。

{1,#2}~k~2

RandomInteger在1和第二个输入之间生成两个s。这将选择一个随机图块。

MapAt[(i=#~ImageAdd~1)&, ..., {1,#2}~k~2]

使该瓷砖变白。将其存储在中i

移动瓷砖

{t,r}=1~k~2

生成两个从0到1的随机整数,并将它们分别存储在t和中r。这将随机选择方向。

o=n[q/@#&,#,r]&@*(n[#&,#,t]&)

定义功能o:组成

  1. 转换输入t时间的功能。
  2. 每行反转一次的功能r
o @#

应用于o输入。

Position[o@#,i][[1,2]]

找到i(白色图像)的列。

k[ ... -1]

减去1并找到一个介于0和该数字之间的随机整数。这将随机选择要移动多少个图块。

o@#/.{a___,b:_~RepeatedNull~ ... ,i,c___}:>{a,i,b,c}

当上述数量的图块出现在i(白色图像)之前时,请切换其位置。

(... q[o= ... ])[ ... ]

反转o功能并将其应用于上述操作的结果。这样可以取消反转和取消转置图像。

循环和图像组装

(n=Nest)[ ... ,#3]

重复上述过程(第三次输入)。

ImageAssemble@

将图像放在一起。


1
好答案!谢谢你的细节!
弗雷德里克
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.