Phân vùng lưới vuông thành các phần có diện tích bằng nhau


17

Thử thách này dựa trên câu đố sau: Bạn được cung cấp nbởi một nlưới với ncác ô được đánh dấu. Công việc của bạn là phân vùng lưới thành ncác phần trong đó mỗi phần bao gồm chính xácn các ô, mỗi phần chứa chính xác một ô được đánh dấu.

Thí dụ

Đây là một câu đố bên trái và giải pháp (duy nhất) của nó ở bên phải:

câu đố giải pháp

Thử thách

Bạn sẽ được cung cấp một bộ ntọa độ không có chỉ mục ở bất kỳ định dạng hợp lý nào.

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

Và công việc của bạn là viết một chương trình trả về bất kỳ phép hợp lệ nào (một lần nữa, ở bất kỳ định dạng hợp lý nào).

[
  [(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)]
]

Nếu câu đố không có giải pháp, chương trình sẽ chỉ ra rằng bằng cách ném lỗi hoặc trả về một giải pháp trống.

Ví dụ đầu vào / đầu ra

[(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)],
                         ]

Chấm điểm

Đây là , vì vậy mã ngắn nhất sẽ thắng.


Điều này được lấy cảm hứng từ câu hỏi Math Stack Exchange này .
Peter Kagey

@Arnauld, có vẻ như đối với câu đố Shikaku, "mục tiêu là chia lưới thành các mảnh hình chữ nhật và hình vuông". Trong trường hợp này, không có ràng buộc như vậy.
Peter Kagey

Xin lỗi vì sự nhầm lẫn. Tôi nghĩ rằng có thể có một thử thách Shikaku ở đâu đó trong hộp cát, hoặc có thể tôi đang dự định tự làm một lúc nào đó - tôi không thể nhớ chắc chắn. Dù bằng cách nào, tôi nghĩ rằng đó là điều tương tự thoạt nhìn.
Arnauld

Tại sao kết quả là một mảng 2d tọa độ? Tôi không hiểu những gì đang được thể hiện ở đó ... Không thể là mảng 2d của chỉ mục của mảng? Ví dụ hàng 3, cột 2 chứa phân vùng có tọa độ tại chỉ số 4?
Olivier Grégoire

Chúng ta có thể giả sử rằng mỗi khu vực có thể được rút ra bằng cách bắt đầu từ tọa độ tham chiếu, như ví dụ cho thấy? Tôi mới nhận ra rằng tôi đã vô tình coi điều này là đương nhiên.
Arnauld

Câu trả lời:


11

JavaScript (ES7), 166 byte

fmộttôiSe

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

Hãy thử trực tuyến!

Làm sao?

mN×NN

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

mNm++

gn(X,Y)jTôi

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

một[n]một[j]

gm

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.