15 퍼즐을 풀 수 있는지 확인하십시오


9

다섯 퍼즐 배열의 절반 만 가능한 상태에서 풀 수있는 독특한입니다. 14 및 15 타일을 뒤집 으면 블록이 뒤로 젖히도록 블록을 밀 수는 없습니다.

당신의 임무는 타일의 배열 상태를 나타내는 원하는 형식으로 정수 목록을 허용하는 프로그램을 작성하는 것입니다 (0에서 15 사이의 숫자의 각 인스턴스를 정확히 하나 포함하고 0은 공백) 4x4 그리드, 그리드를 해결할 수 있는지 여부를 결정하는 단일 부울 값을 출력합니다.

어떤 언어로든 이것을 수행하는 가장 짧은 코드가 이깁니다.


좋은 질문 :)
Cruncher

나는이 질문을하려고했으나 임의의 길이를 가졌다. 그러나 그것은 도전에 거의 추가되지 않습니다.
Jonathan Allan

답변:


0

젤리 , 9 바이트

Œc>/€;TSḂ

왼쪽-오른쪽과 오른쪽-왼쪽을 번갈아 가면서 행 주요 순서로 읽은 정수 목록을 허용하는 모나드 링크는 0해결 가능하고 1그렇지 않은 경우 ( ¬코드의 오른쪽에 반전을 추가 하기 위해) 생성합니다.

온라인으로 사용해보십시오! (이 예제는 12 개를 제자리에 밀어 넣는 보드입니다)

어떻게?

John Dvorak의 답변 과 유사하게 패리티를 계산하고 스네이크와 같은 입력 순서를 사용하여 체커 보드 패리티를 단순화합니다. 패리티의 동등성을 검사하는 대신 비 순차 카운트를 0이 아닌 인덱스와 합산하고 그 여부를 테스트하지만 이상한:

Œc>/€;TSḂ - Link: list of integers
Œc        - unordered pairs
    €     - for each:
   /      -   reduce with:
  >       -     greater than?
      T   - truthy indices (i.e. [1..16] without 1-indexed index of 0)
     ;    - concatenate
       S  - sum
        Ḃ - is odd?

4

J, 28 자

((C.!.2=_1^i.&0)&.".&.stdin''

입력 순서는 행의 주요 항목으로, 테이블의 단일 경로에서 행을 왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로 번갈아 읽습니다. 0이 왼쪽 상단에 속한다고 가정합니다.

Windows에서의 사용법 :

<nul set /p="0 1 2 3 7 6 5 4 8 9 10 11 15 14 13 12" | jconsole c:\...\15.jhs

설명:

  • <nul set /p=입력 개행 방지하는 데 사용되는 echo것을 생성 ".싫어한다. 물론 유닉스는을 지원한다 echo /n.
  • v&.".&.stdin''"입력을 해석 한 후 입력을 구문 분석 한 다음 v를 수행 한 다음 구문 분석을 취소 (= 형식)하고 입력을 취소 (= 출력)"한다는 의미의 "stdin에서 구문 분석중인 v"를 읽습니다. 1!:1]3한 문자보다 짧지 만 정의 된 역수가 없습니다.
  • C.!.2"순열 패리티"를 의미합니다. 1(짝수 패리티) 또는 _1(홀수 패리티)를 리턴합니다 . 그건,_1^inversions
  • _1^i.&0 "-1의 지수 거듭 제곱"을 의미합니다.
  • 따라서, C.!.2=_1^i.&0"순열 패리티가 홀 위치 패리티와 동일합니까?"

이것은 4x4 보드에서 작동하지만 원하는 끝 위치가 행에서 왼쪽에서 오른쪽으로 큰 경우 해결 된 위치의 순열은 홀수의 역수를 가지며 따라서 패리티는 홀수입니다. 또한 원하는 구멍 위치가 왼쪽 상단에서 오른쪽 하단으로 이동하면 패리티가 (입력 순서에 따라) 반전됩니다. 두 경우 모두 수정은 하나의 문자입니다. 예상 된 패리티를 뒤집기 위해 추가 -한 후 추가하십시오 =.

정확성 증명 :

각 이동 후, 0은 숫자와 위치를 교환하여 순열 패리티를 뒤집습니다. 또한 0은 입력 순서에서 홀수 및 짝수 위치로 표시되는 흰색과 검은 색 바둑판 위치 사이를 번갈아 표시합니다. 따라서이 조건이 필요합니다. 계산 인수로도 충분합니다. 위치의 정확히 절반을 해결할 수 있다는 것은 일반적인 지식입니다. 이 조건은 가능한 위치의 정확히 절반을 필터링합니다.


"0도 홀수 짝수 위치 사이에서 번갈아 가며"라고 말하면 +1, -1, +4 또는 -4만큼 변경되지 않습니까? 체크 된 패턴은 필요한 채색을 제공하지만 더 정확하게 설명 할 수 있다고 생각합니다.
Peter Taylor

@PeterTaylor 당신이 맞습니다; 죄송합니다. 내 수정 사항이 유효한 수정 사항으로 간주됩니까?
John Dvorak

나는 당신의 편집이 완전히 별개의 문제를 해결한다고 생각합니다. 내가 인용 한 비트는 마지막 단락에 있습니다.
피터 테일러

"홀수와 짝수 위치 사이"는 "체스 판의 검은 색과 흰색 사각형 사이"와 더 비슷합니다.
Joe Z.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.