정사각형 그리드를 같은 면적의 부분으로 분할


17

이 문제는 다음 퍼즐을 기반으로 : 당신은이 제공됩니다 n에 의해 n그리드 n표시 세포. 당신의 임무는 n각 부분 n이 정확히 하나의 표시된 셀을 포함하는 정확히 셀로 구성된 부분으로 그리드를 분할 하는 것입니다.

왼쪽에 퍼즐이 있고 오른쪽에 (독특한) 솔루션이 있습니다.

퍼즐 해결책

도전

당신은 세트를 받게 될 것입니다 n합리적인 형식으로 인덱스 0 개의 좌표 제공됩니다.

[(0,0), (0,3), (1,0), (1,1), (2,2)]

그리고 당신의 임무는 유효한 분할을 반환하는 프로그램을 작성하는 것입니다.

[
  [(0,0), (0,1), (0,2), (1,2), (1,3)],
  [(0,3), (0,4), (1,4), (2,4), (3,4)],
  [(1,0), (2,0), (3,0), (4,0), (4,1)],
  [(1,1), (2,1), (3,1), (3,2), (4,2)],
  [(2,2), (2,3), (3,3), (4,3), (4,4)]
]

퍼즐에 해결책이 없으면 프로그램은 오류를 던지거나 빈 해결책을 반환함으로써이를 표시해야합니다.

입력 / 출력 예

[(0,0)]               => [[(0,0)]]

[(0,0), (1,1)]        => [
                          [(0,0), (1,0)], 
                          [(0,1), (1,1)]
                         ]

[(0,0), (0,1), (1,0)] => [] (no solution)

[(0,0), (0,1), (0,2)] => [
                          [(0,0), (1,0), (2,0)], 
                          [(0,1), (1,1), (2,1)],
                          [(0,2), (1,2), (2,2)],
                         ]

[(0,0), (0,2), (1,2)] => [
                          [(0,0), (1,0), (2,0)], 
                          [(0,1), (0,2), (1,1)],
                          [(1,2), (2,1), (2,2)],
                         ]

채점

이것은 이므로 가장 짧은 코드가 승리합니다.


이것은 이 Math Stack Exchange 질문 에서 영감을 받았습니다 .
Peter Kagey 2012 년

@Arnauld, 그것은 시카 쿠 퍼즐처럼 보인다. "목적은 사각형과 사각형 조각으로 격자를 나누는 것이다". 이 경우에는 그러한 제약이 없습니다.
Peter Kagey

혼란을 드려 죄송합니다. 샌드 박스 어딘가에 시카 쿠 챌린지가 있거나 어쩌면 어느 시점에서 직접 시카 쿠를 도전 할 계획이라고 생각합니다. 어느 쪽이든, 나는 그것이 언뜻 똑같은 것이라고 생각했다.
Arnauld

결과가 2 차원 좌표 배열 인 이유는 무엇입니까? 나는 거기에 표현되는 것을 이해하지 못한다 ... 배열의 인덱스의 2 차원 배열이 될 수 없습니까? 예를 들어 행 3, 열 2에는 인덱스 4에 좌표가있는 파티션이 있습니까?
Olivier Grégoire

예제에서 알 수 있듯이 기준 좌표에서 시작하여 각 영역을 그릴 수 있다고 가정 할 수 있습니까? 나는 무의식적으로 이것을 당연한 것으로 생각한다는 것을 깨달았습니다.
Arnauld 2012 년

답변:


11

자바 스크립트 (ES7), 166 바이트

에프에스이자형

a=>(m=a.map(_=>[...a]),g=(n,X,Y,j=0,i)=>a[n]?a[j]?m.some((r,y)=>r.some((v,x)=>++v|(X-x)**2+(Y-y)**2-1?0:g(r[x]=n,x,y,j+1,i|x+[,y]==a[n])?1:r[x]=v)):i&&g(n+1):1)(0)&&m

온라인으로 사용해보십시오!

어떻게?

미디엄×

m = a.map(_ => [...a])

미디엄미디엄++

(엑스,와이)제이나는

g = (n, X, Y, j = 0, i) => a[n] ? a[j] ? ... : i && g(n + 1) : 1

[][제이] 충분한 세포가 현재 지역에 작성되었는지 알 수 있습니다.

미디엄

m.some((r, y) =>          // for each row r[] at position y in m[]:
  r.some((v, x) =>        //   for each cell of value v at position x in r[]:
    ++v |                 //     if this cell is already filled (i.e. v is numeric)
    (X - x) ** 2 +        //     or the squared Euclidean distance between
    (Y - y) ** 2 -        //     (X, Y) and (x, y)
    1 ?                   //     is not equal to 1:
      0                   //       this is an invalid target square: do nothing
    :                     //     else:
      g(                  //       do a recursive call to g:
        r[x] = n,         //         pass n unchanged and fill the cell with n
        x, y,             //         pass the coordinates of the current cell
        j + 1,            //         increment j
        i |               //         update i:
        x + [,y] == a[n]  //         set it if (x, y) = a[n]
      ) ?                 //       if the result of the call is truthy:
        1                 //         return 1
      :                   //       else:
        r[x] = v          //         reset the cell to NaN
  )                       //   end of inner map()
)                         // end of outer map()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.