코드 슬라이드 퍼즐을 코딩하십시오!


12

가장 잘 알려진 슬라이딩 퍼즐15 개의 퍼즐 입니다. 4 x 4 그리드, 15 타일 및 빈 그리드 공간이 있습니다. 타일은 빈 공간으로 만 이동할 수 있으며 항상 그리드와 일치해야합니다.

일반화 된 슬라이딩 퍼즐을 그리드에 스냅 된 몇 개의 동일한 표시되지 않은 타일 ​​(0과 W × H 사이 )을 포함 하는 H 하이 그리드 ( W , H 양의 정수)에 의해 2 차원 W 너비로 정의 합니다. 비어있는 그리드 공간이 나머지 영역을 채우는 방식으로 (겹치지 않고)

예를 들어 WH 가 3이고 타일이 T있고 빈 공간이 E많은 사이딩 퍼즐 배열 중 하나 인 경우

TTT
TET
EET

이 퍼즐에는 4 가지 가능한 동작이 있습니다 : 모든 것을 밀어 내고 , 모든 것을 내려 놓고 , 모든 것을 왼쪽 으로 밀어 내거나, 모든 것을 제대로 밀어 붙 입니다. 어떤 방향으로의 '쇼킹'은 다른 타일이나 그리드 경계에 부딪 칠 때까지 모든 타일을 가능한 한 그 방향으로 이동시킵니다. 때로 밀면 그리드의 레이아웃이 변경되지 않습니다.

예제 그리드를 올바르게 입력하면 결과는

TTT
ETT
EET

결과를 왼쪽으로 밀었습니다.

TTT
TTE
TEE

결과는

EET
TET
TTT

(가장 왼쪽이 모두 T움직 였다는 것에 유의하십시오 )

이 경우에는 밀어 올리면 그리드 레이아웃이 변경되지 않습니다.

타일은 구분할 수 없으므로이 퍼즐에는 '해결 된'상태가 없습니다. 또한 퍼즐을 만든 후에는 되돌릴 수없는 레이아웃에서 퍼즐이 시작될 수 있습니다 (예 : 3 x 3 격자 중간에 타일 하나).

도전

인쇄 가능한 ASCII 만 사용하면 M 문자 너비와 N 문자 높이 의 두 개의 직사각형 코드 블록 (양의 정수 M , N )이 작성됩니다. 하나의 코드 블록은 슬라이딩 퍼즐의 타일을 나타내며, 다른 코드 블록은 빈 그리드 공간을 나타냅니다.

이 두 코드 블록을 W by H 그리드에 배치하면 텍스트 파일로 저장하고 일반 프로그램으로 실행할 수있는 코드 표현 슬라이딩 퍼즐이 만들어집니다. 실행될 때, 이런 종류의 프로그램은 stdin을 통해 1에서 4까지의 숫자를 사용자에게 프롬프트해야합니다. 1은 위, 아래, 3, 왼쪽, 4를 나타 냅니다. 사용자가 숫자를 입력하고 엔터를 입력하면 프로그램은 소스 코드 타일을 해당 방향으로 밀어 넣는 방법을 계산하고 새 퍼즐 레이아웃을 파일 (새 파일 또는 같은 파일)에 저장 한 다음 종료합니다.

이 과정은 각 shove 후에 생성 된 새로운 슬라이딩 퍼즐 코드 파일을 사용하여 무한정 반복 될 수 있습니다.

타일 ​​코드 블록이 다음과 같다고 가정 해 봅시다.

//   my
// tile

내 빈 그리드 공간 코드 블록은 다음과 같습니다

//empty
//space

( M = 7, N = 2, 이것은 실제 코드가 아닙니다)

이 두 블록의 유효한 슬라이딩 퍼즐 배열은 내가 사용하는 언어로 프로그램을 만들어야 사용자가 어떤 방향으로 밀어 넣을 수 있도록 실행할 수 있습니다.

예제 그리드의 코드 표현은 다음과 같습니다.

//   my//   my//   my
// tile// tile// tile
//   my//empty//   my
// tile//space// tile
//empty//empty//   my
//space//space// tile

따라서 이것을 실행하고 2 (아래로)를 누르면 Enter는 이것을 다른 파일 (또는 동일한 파일)에 씁니다.

//empty//empty//   my
//space//space// tile
//   my//empty//   my
// tile//space// tile
//   my//   my//   my
// tile// tile// tile

그런 다음 해당 파일을 동일한 방식으로 실행하고 밀어 넣을 수 있습니다.

노트

  • W by H 슬라이딩 퍼즐 의 모든 코드 표현은 실행 가능해야하며 제대로 작동해야합니다. 여기에는 모든 격자 크기가 1 x 1에서 적당한 최대 값 (2 16 x 2 16 이상)이 포함됩니다.

  • 프로그램 자체 소스 코드를 읽을 수 있습니다 . 키네 기반 제한은 없습니다. 어떤 종류의 의견도 괜찮습니다.

  • 밀어 넣을 타일이 없거나 밀어 넣을 수없는 경우에도 프로그램에서 밀어 넣을 방향을 묻는 메시지를 표시해야합니다. 프롬프트는 단순히 숫자를 입력하기위한 장소이므로 메시지가 필요하지 않습니다.

  • 입력이 항상 유효하다고 가정 할 수 있습니다 (1, 2, 3 또는 4).

  • 공백으로 코드 블록을 채우는 것이 좋습니다. 그것들은 인쇄 가능한 ASCII 만 가능하다는 것을 기억하십시오. 이것은 탭과 줄 바꿈이 없음을 의미합니다 (코드 블록을 형성하는 데 도움이되는 줄 바꿈 제외).

  • 귀하의 언어가 stdin을 지원하지 않으면 가장 가까운 입력 방법을 사용하십시오.

  • 코드 퍼즐 파일 끝에 줄 바꿈을 요구할 수 있습니다. (또는 그곳에 없어야합니다.)

  • 새 파일 이름을 지정하는 방법은 중요하지 않습니다. f.txt아니면 f괜찮습니다.

  • 두 코드 블록이 동일하지 않을 수 있습니다.

채점

목표는 가장 작은 코드 크기로이를 수행하는 것입니다. 가장 작은 코드 블록 영역 ( M × N )을 가진 제출 이 승자입니다. 타이 브레이커는 가장 높은 투표 응답으로갑니다.

관련 : 생명의 게임 자체를 실행하는 코드


따라서 빈 공간이 있고 타일 블록이없는 경우 프로그램이 작동해야합니까?
grc

@grc 네 번째 질문에 예, 완전히 비었거나 가득 찬 경우에도 여전히 가치를 요구해야한다는 것을 기억하십시오. 블록이 동일 할 수 없습니다. 나는 그들이 당신이 상당히 사소한 답변을 주장 할 수 있다면 추측합니다. 제가 언급하겠습니다.
Calvin 's Hobbies

원본 소스 파일의 이름을 지정할 수 있습니까?
feersum

@feersum 당신은 항상 그것이 있다고 가정 할 수 f.txt있습니까? 예.
Calvin 's Hobbies

코드 블록이 항상 한 줄이되지 않습니까? 멀티 라인 코드 블록은 나에게 정말 복잡해 보이며 2D esolanguages는 파일 작성을 지원하지 않을 것입니다.
데프

답변:


5

테코 153

빈 블록 :

0T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

타일 ​​블록 :

1T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

자체적으로 수정되는 프로그램은이라는 파일에 저장해야합니다 x. 명령을 통해 실행할 수 있습니다 tecoc mung x.. 점이 중요합니다. 그것없이, TECO는라는 파일을 찾으려고 시도했습니다 x.tec. 후행 줄 바꿈이 있어야합니다.

언어가 인쇄 할 수없는 많은 문자를 사용하기 때문에 인쇄 가능한 ASCII 제한은 약간의 고통이었습니다. 대부분은 캐럿으로 시작하는 2 바이트 시퀀스로 대체 될 수 있지만 "이스케이프"(ASCII 27)는 '이용할 수있는'한 문자이므로 ASCII 값을 문자열에 넣어야합니다. exec it. 따라서 4 바이트는로 EBx<Esc>폭발했습니다 @^Ux#EBx#27@:^UX##Mx.

이것은 특히 프로그램을 두 부분으로 나누고 문자열로 저장하고 둘 다있는 경우에만 실행하여 크게 줄일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.