固定图像


28

我喜欢希尔伯特曲线


解决此挑战的任务是拍摄一张图像(严格来说是一个正方形图像,其所有侧面都是2像素的幂),然后以Z字形方式逐行展开,并以伪希尔伯特曲线将其拉回。

拆散

要解散,您将从左上角的像素开始向右移动,直到到达图像边缘。触及图像边缘后,您将向下移动到下一行并开始向左移动,直到再次触碰边缘。您将继续逐行展开方向,每次切换方向,以便获得一条连续曲线。这看起来像是玩耍的蛇游戏

拆散的结果应该是一个像素顺序,其中每个像素恰好包含一次

列队

订购像素后,您将按照伪希尔伯特曲线的路径在新的大小相同的画布上重新排列它们。对于2**n正方形图像,应使用伪希尔伯特曲线的第n次迭代。每个像素将恰好放置在新画布上的一个位置。您应该重新排列图像,以便原来在左上角(蛇形曲线的起点)的点将保留在那里,而在右下角(蛇形曲线的终点)的点将放置在右上角。

输入输出

您的程序或函数应通过标准方法获取指定约束的图像,并通过标准方法输出另一图像。

计分

这是具有最少字节胜利的程序。

例子

输入值

蒙德里安

输出量

输出1


输入值

罗斯科

输出量

输出2


输入值

加扰

输出量

狮子


我还建议对空白的白色或纯色图像进行测试,以确保您没有丢失任何像素。

随意将自己的结果包括在答案中!


可以采用RGB值数组而不是图像作为输入吗?那输出呢?
JungHwan Min

@JHM不,你不能。您可以选择所需的任何图像格式,因此,如果您的语言没有内置的图像支持,则可以使用未压缩的.ppm文件,该文件与RGB值数组非常相似。
小麦巫师

Answers:


8

数学,286个 273字节

Image[Array[1,{l=Length@#,l}]~ReplacePart~Thread[#&@@@Split[#&@@@FoldList[Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@#,0},_,#]&,{{1,1},I},Characters@Nest[StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"},"L",Log2@l]]]->Join@@MapAt[Reverse,#,2;;;;2]]]&@*ImageData

!充满挑战但又有趣!

说明

ImageData

将转换Image为RGB值数组。

Array[1,{l=Length@#,l}]

用head 生成一个lby l数组1,其中the l是输入的长度(即图像的宽度)。

这样产生{{1[1, 1], 1[1, 2], ..., 1[1, L]}, {1[2, 1], ..., 1[2, L]}, ..., {1[L, 1], ..., 1[L, L]}}l写成大写以减少混乱)

StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"}

一个StringReplace替换每个函数"L""+RF-LFL-FR+""R""-LF+RFR+FL-"

Nest[ ... ,"L",Log2@l]

StringReplace功能应用于String "L"Log2[l]时间。

Characters

将结果转换String为个List字符。

Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@#,0},_,#]&

一个未命名的函数,该函数:

  • 如果第二个输入为"-",则将第一个输入的第二个元素乘以I
  • 如果第二个输入为"+",则将第一个输入的第二个元素除以I
  • 如果第二输入为"F",则将第一输入增加第二输入的ReIm(分离输入的实部和虚部)。
FoldList [...,{{{1,1},I},...]

从开始{{1,1},I},使用List字符的每个元素作为第二个输入,累计应用上述未命名函数。此代码产生所有迭代的输出。

#&@@@Split[#&@@@ ... ]

摆脱每个元素的第二个元素List并删除重复的元素。(到此为止的步骤将生成List希尔伯特曲线的坐标)

Join@@MapAt[Reverse,#,2;;;;2]

解开输入的RGB数组(每隔一行反转并展平)。

Thread[ ... -> ... ]

创建Rule对象,使第一个输入中的第一个元素(希尔伯特曲线的坐标)与第二个输入中的第一个元素(解散图像),第二个元素与第二个输入配对,依此类推。

... ~ReplacePart~ ...

应用这些更换RuleS到Array来自第二步骤。

Image

将RGB值数组转换为Image

进/出样品

输入:

测试用例1

输出:

输出


输入:

钢之炼金术师的Edward和Alphonse Elric

输出:

at

反函数(266253字节)

Image[MapAt[Reverse,Extract[#,#&@@@Split[#&@@@FoldList[Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@b,0},_,#]&,{{1,1},I},Characters@Nest[StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"},"L",Log2[l=Length@#]]]]]~Partition~l,2;;;;2]]&@*ImageData

5

八度234字节

I=imread(input(''));w=rows(I);X=[0,3;1,2];for k=2:log2(w);n=numel(X);X=[X',rot90(X',2)+3*n;X+n,X+2*n];end;for k = 1:3;I(2:2:end,:,k)=fliplr(I(2:2:end,:,k));end[~,S]=sort(X(:));I(S+(0:w^2:2*w^2))=permute(I,[2 1 3]);imwrite(I,input(''))

输入和输出图像的文件名应从标准输入中提供。没有输入/输出的代码大小为194个字节
说明:

索引的基本模式是:

X =
  0 3
  1 2

在每个迭代中,从上一个迭代的结果中复制4个副本,并对每个副本应用某种转换,然后将所有块连接起来以形成当前结果。

X =[0,3;1,2];
for k = 2:log2(s)
    n=numel(X);
    X = [X',rot90(X',2)+3*n;X+n,X+2*n];
end

所以我们有:

block(1,1): X' 
block(1,2): rot90(X',2)+3*n 
block(2,1): X+n
block(2,2): X+2*n

0    1  | 14   15
3    2  | 13   12
--------|--------
4    7  |  8   11
5    6  |  9   10

希尔伯特索引排序,并返回排序元素的索引:

[~,S]=sort(X(:));

展开应用会翻转所有偶数行:

for k = 1:3
    I(2:2:end,:,k) = fliplr(I(2:2:end,:,k));
end

应用了重新排列:
-S为每个通道
重复-由于在八度数据中按列排列,因此应用了置换

I(S+(0:w^2:2*w^2))=permute(I,[2 1 3]);

图片示例:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明


如果要避免使用I / O,则可以选择使程序作为函数运行。
Wheat Wizard

function + end关键字消耗更多字节!
rahnema16年
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.