Mathematica、286273バイト
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
。ここで、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},_,#]&
次の名前のない関数:
- 2番目の入力がの場合、
"-"
最初の入力の2番目の要素にを掛けますI
。
- 2番目の入力がの場合、
"+"
最初の入力の2番目の要素をで除算しI
ます。
- 2番目の入力がの場合、
"F"
最初の入力を2番目の入力のReIm
(入力の実部と虚部を分離する)だけ増やします。
FoldList [...、{{1,1}、I}、...]
から始めて{{1,1},I}
、List
文字の各要素を2番目の入力として使用して、上記の名前のない関数を累積的に適用します。このコードは、すべての反復の出力を生成します。
#&@@@Split[#&@@@ ... ]
それぞれの2番目の要素を取り除き、List
重複を削除します。(この時点までのステップList
は、ヒルベルト曲線の座標を生成します)
Join@@MapAt[Reverse,#,2;;;;2]
入力RGB配列を解きます(1行おきに反転し、平坦化します)。
Thread[ ... -> ... ]
Rule
最初の入力の最初の要素(ヒルベルト曲線の座標)が2番目の入力の最初の要素(展開された画像)、2番目の要素が2番目の入力などとペアになるようにオブジェクトを作成します。
... ~ReplacePart~ ...
これらの代替適用Rule
にSをArray
第二のステップから。
Image
RGB値の配列に変換しますImage
。
サンプルイン/アウト
入力:
出力:
入力:
出力:
逆関数(266 253バイト)
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