매스 매 티카, 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
하십시오.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
첫 번째 입력의 첫 번째 요소 (Hilbert 곡선의 좌표)가 두 번째 입력의 첫 번째 요소 (확장되지 않은 이미지), 두 번째 요소가있는 두 번째 입력 등과 쌍을 이루도록 개체를 만듭니다 .
... ~ReplacePart~ ...
교체품 Rule
을 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