数学,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 生成一个l
by 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~ ...
应用这些更换Rule
S到Array
来自第二步骤。
Image
将RGB值数组转换为Image
。
进/出样品
输入:
输出:
输入:
输出:
反函数(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