가장 잘 알려진 슬라이딩 퍼즐 은 15 개의 퍼즐 입니다. 4 x 4 그리드, 15 타일 및 빈 그리드 공간이 있습니다. 타일은 빈 공간으로 만 이동할 수 있으며 항상 그리드와 일치해야합니다.
일반화 된 슬라이딩 퍼즐을 그리드에 스냅 된 몇 개의 동일한 표시되지 않은 타일 (0과 W × H 사이 )을 포함 하는 H 하이 그리드 ( W , H 양의 정수)에 의해 2 차원 W 너비로 정의 합니다. 비어있는 그리드 공간이 나머지 영역을 채우는 방식으로 (겹치지 않고)
예를 들어 W 와 H 가 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 )을 가진 제출 이 승자입니다. 타이 브레이커는 가장 높은 투표 응답으로갑니다.
관련 : 생명의 게임 자체를 실행하는 코드
f.txt
있습니까? 예.