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


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.