슬라이딩 퍼즐로 그림 만들기


14

요약

이 과제의 목표는 프랑스어로 taquin 이라고도 하는 15 퍼즐 / 슬라이딩 퍼즐 의 실행 취소 된 이미지 버전을 만드는 것 입니다.

세부:

다음과 같이 구성된 입력이 제공됩니다.

  • 이미지,
  • 정수 n,
  • 타 정수 r,

프로그램 또는 기능 또는 기타 적합한 것은 입력과 동일한 이미지 ( 예 : 동일한 크기 및 형식)를 출력해야 하지만 다음과 같은 프로세스를 거쳤습니다.

  1. 이미지를 사각형 으로 나누고
  2. 그 직사각형 중 하나를 무작위로 제거하십시오.
  3. 점 (2.)의 영향을받는 선 / 열 에서 임의의 수의 인접한 직사각형을 이동하여 생성 된 구멍이 채워지고이 선 / 열에서 다른 구멍이 생성됩니다. 0블랭크가 모서리 또는 모서리에있는 경우이 숫자가 될 수 있습니다 .

(3) r번 반복하십시오 .

설명 :

  • 3 단계에서 선에서 사각형을 이동 한 경우 다음 반복에서 열의 사각형을 이동해야합니다.
  • 직사각형을 한 단계 씩 왼쪽에서 오른쪽으로 이동 한 경우 다음 행 단계에서 오른쪽에서 왼쪽으로 이동해야합니다 (열과 관련하여 위에서 아래로, 아래에서 위로).
  • n사진 측면의 길이를 나누도록 선택되어 있다고 가정 할 수 있습니다 .

마지막 요점 :

.gif전체 과정을 보여주는 애니메이션 은 매우 환영합니다.

다음 그림 ( 1024x768)을 모델 과 함께 사용 n=16하고 r=100모델로 사용 하는 것이 좋습니다. 물론 관련성이 있고 SE의 규칙을 준수 하는 한 다른 그림을 사용할 수 있습니다 .

하는 것으로 표준 허점 정책이 적용됩니다.

이것은 이므로 짧은 제출이 승리합니다!

개, 고양이 및 오리 애호가는 만족해야합니다!

일례가 요청되었으므로, 여기에, "손"만든 하나 n=4r=1

1 단계와 2 단계

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

3 단계 : 왼쪽 방향으로 두 개의 직사각형

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


이 예에서는 사각형의 크기가 같을 필요는 없으며 전체 이미지를 가리지 않아도되며 원본 이미지 위에 그려진 선을 포함해야합니다. 사양이나 예제를 변경하여이를 명확히 할 수 있습니까?
trichoplax

@trichoplax : 예제는 페인트와 신속 함으로 손으로 그려졌습니다. 제대로 다시하겠습니다.
프레데릭

@trichoplax : 나는 당신의 요점을 완전히 얻지 못했다는 것을 인정해야하지만,이 오프닝 라인은 도전을 이해하는 데 필요하지 않으므로 그것을 유지하는 것이 쓸모없는 것 같습니다.
프레데릭

move a random number of contiguous rectangles직사각형이 될 수 있습니까? (블랭크가 가장자리 / 코너에있을 때 프로그램 변경 동작을 만드는 것은 고통 스러울 것입니다)
JungHwan Min

@JungHwanMin : 그렇습니다. 좋은 말 감사합니다!
프레데릭

답변:


10

수학, 246 바이트

ImageAssemble@(n=Nest)[k=RandomInteger;q=Reverse;({t,r}=1~k~2;q[o=n[q/@#&,#,r]&@*(n[#&,#,t]&)])[o@#/.{a___,b:_~RepeatedNull~k[Position[o@#,i][[1,2]]-1],i,c___}:>{a,i,b,c}]&,MapAt[(i=#~ImageAdd~1)&,#~ImagePartition~Scaled[1/#2],{1,#2}~k~2],#3]&

익명의 기능. Mathematica의 Transpose연산자에 해당하는 U + F3C7을 포함 합니다. 이 함수는 Image객체를 가져 와서 객체를 반환 Image합니다.

샘플 애니메이션, n=16r=100

5000 회 반복 후 :

여기에 이미지 설명을 입력하십시오(더 큰 버전을 보려면 이미지를 클릭하십시오)

설명

초기화

n=Nest

Nest기능 (반복 작업)을 저장하십시오 n.

k=RandomInteger;q=Reverse;

가게 RandomInteger의 기능 kReverse함수를 q.

이미지 나누기

#~ImagePartition~Scaled[1/#2]

입력 이미지를 (두 번째 입력) ^ 2 타일로 분할하십시오.

{1,#2}~k~2

RandomInteger1과 두 번째 입력 사이에 두 개의을 생성하십시오 . 이것은 임의의 타일을 선택합니다.

MapAt[(i=#~ImageAdd~1)&, ..., {1,#2}~k~2]

타일을 흰색으로 만듭니다. 에 저장하십시오 i.

타일 ​​이동

{t,r}=1~k~2

0에서 1까지의 두 개의 임의 정수를 생성 t하고 r각각 및에 저장합니다 . 방향을 임의로 선택합니다.

o=n[q/@#&,#,r]&@*(n[#&,#,t]&)

기능 정의 o:의 구성

  1. 입력 t시간을 바꾸는 함수 .
  2. 각 행을 반전시키는 함수 r.
영형@#

o입력에 적용하십시오 .

Position[o@#,i][[1,2]]

i(흰색 이미지) 의 열을 찾습니다 .

k[ ... -1]

1을 빼고 0과 그 숫자 사이의 임의의 정수를 찾으십시오. 이것은 움직일 타일 수를 무작위로 선택합니다.

o@#/.{a___,b:_~RepeatedNull~ ... ,i,c___}:>{a,i,b,c}

상기 타일 수가 i(흰색 이미지) 이전에 나타나면 , 그 장소를 바꾸십시오.

(... q[o= ... ])[ ... ]

o기능을 반대로하여 위의 작업 결과에 적용하십시오. 이미지를 반전 시키거나 바꿉니다.

루핑 및 이미지 어셈블리

(n=Nest)[ ... ,#3]

위 과정 (세번째 입력)을 반복하십시오.

ImageAssemble@

이미지를 정리하십시오.


1
좋은 대답! 자세한 내용에 감사드립니다!
프레데릭
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.