힐 버티 파이 이미지


28

나는 힐버트 커브를 좋아한다 .


이 문제를 해결하려면 이미지 (모든면이 2 픽셀의 제곱을 갖는 정사각형 이미지)를 찍고 지그재그 방식으로 한 줄씩 해체하고 유사 힐버트 곡선으로 백업하는 것입니다. .

풀기

풀려면 왼쪽 상단 모서리의 픽셀부터 시작하여 이미지 가장자리에 도달 할 때까지 오른쪽으로 이동하십시오. 이미지의 가장자리에 닿으면 다음 행으로 내려가 다시 가장자리에 닿을 때까지 왼쪽으로 이동하기 시작합니다. 연속 곡선을 얻기 위해 매번 방향을 전환하여 행을 계속 풀 수 있습니다. 이것은 뱀의 게임처럼 보일 것입니다

풀기 결과는 모든 픽셀을 정확히 한 번 포함하는 픽셀 순서 여야합니다.

리 라벨링

픽셀을 주문하면 의사 힐버트 곡선의 경로를 따라 동일한 크기의 새 캔버스에서 픽셀을 다시 정렬합니다. A의 2**n크기의 정사각형 이미지 당신은 의사 힐버트 곡선의 n 번째 반복을 사용해야합니다. 각 픽셀은 새 캔버스에서 정확히 한 지점에 배치됩니다. 원래 왼쪽 상단 (뱀 곡선의 시작)에있는 지점이 그대로 유지되고 오른쪽 하단 (뱀 곡선의 끝)에있는 지점이 오른쪽 상단에 배치되도록 이미지를 다시 표시해야합니다.

I / O

프로그램 또는 함수는 표준 방법을 통해 지정된 구속 조건의 이미지를 가져 와서 표준 방법을 통해 다른 이미지를 출력해야합니다.

채점

이것은 가장 적은 바이트 수를 가진 프로그램입니다.

입력

몬드리안

산출

출력 1


입력

로스코

산출

출력 2


입력

스크램블

산출

사자


또한 빈 흰색 또는 단색 이미지를 테스트하여 픽셀이 없는지 확인하는 것이 좋습니다.

답변에 자신의 결과를 자유롭게 포함하십시오!


이미지 대신 RGB 값의 배열을 입력으로 가져도 괜찮습니까? 출력은 어떻습니까?
JungHwan Min

@JHM 아니오 당신은 할 수 없습니다. 원하는 이미지 형식을 선택할 수 있으므로 언어에 내장 된 이미지 지원이없는 경우 RGB 값 배열과 매우 유사한 압축되지 않은 .ppm 파일을 사용할 수 있습니다.
밀 마법사

답변:


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

변환 ImageRGB 값들의 배열.

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

head를 사용 하여 lby 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

결과 StringList문자 로 변환하십시오 .

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~ ...

교체품 RuleArray두 번째 단계부터 적용하십시오 .

Image

RGB 값의 배열을 Image .

샘플 인 / 아웃

입력:

테스트 사례 1

산출:

산출


입력:

강철의 연금술사 에드워드와 알폰스 엘릭

산출:

왓

역함수 ( 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

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

Hilbert 인덱스 정렬 및 정렬 된 요소 인덱스가 리턴되었습니다.

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

모든 짝수 행을 뒤집어서 적용한 결과 :

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

Reraveling 적용 :
-S는 각 채널에 대해
반복됨-Octave 데이터에서 열 단위로 정렬 된 이후 적용됨

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

이미지 예 :

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


I / O를 사용하지 않으려면 프로그램을 함수로 작동하도록 선택할 수 있습니다.
밀 마법사

function + end 키워드는 더 많은 바이트를 소비합니다!
rahnema1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.