แบ่งตารางสี่เหลี่ยมออกเป็นส่วน ๆ ของพื้นที่เท่ากัน


17

ความท้าทายนี้จะขึ้นอยู่กับปริศนาต่อไปนี้: คุณจะได้รับnจากnตารางที่มีnเซลล์ที่ทำเครื่องหมายไว้ งานของคุณคือการแบ่งพาร์ติชันกริดออกเป็นnส่วนต่าง ๆ ซึ่งแต่ละส่วนประกอบด้วยnเซลล์ที่แน่นอนแต่ละส่วนประกอบด้วยเซลล์ที่ทำเครื่องหมายไว้หนึ่งเซลล์

ตัวอย่าง

นี่คือปริศนาทางด้านซ้ายและโซลูชัน (ที่ไม่ซ้ำกัน) ทางด้านขวา:

ปริศนา วิธีการแก้

ท้าทาย

คุณจะได้รับชุดของnพิกัดศูนย์ดัชนีในรูปแบบที่เหมาะสม

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

เกณฑ์การให้คะแนน

นี่คือดังนั้นรหัสที่สั้นที่สุดจึงชนะ


นี้ได้รับแรงบันดาลใจจากคำถามคณิตศาสตร์ Stack แลกเปลี่ยนนี้
Peter Kagey

@Arnauld ดูเหมือนว่าสำหรับปริศนาชิกากุ "วัตถุประสงค์คือเพื่อแบ่งตารางออกเป็นชิ้นสี่เหลี่ยมและสี่เหลี่ยม" ในกรณีนี้ไม่มีข้อ จำกัด ดังกล่าว
Peter Kagey

ขอโทษสำหรับความสับสน. ฉันคิดว่าอาจจะมีความท้าทาย Shikaku อยู่ที่ไหนสักแห่งในกล่องทรายหรือบางทีฉันอาจวางแผนที่จะทำให้ตัวเองในบางจุด - ฉันจำไม่ได้แน่นอน ทั้งสองวิธีฉันคิดว่ามันเป็นสิ่งเดียวกันในแวบแรก
Arnauld

ทำไมผลลัพธ์จึงเป็นพิกัด 2d ฉันไม่เข้าใจสิ่งที่กำลังแสดงอยู่ที่นั่น ... มันเป็นอาร์เรย์ 2 มิติของดัชนีของอาร์เรย์หรือไม่? ตัวอย่างเช่นแถว 3 คอลัมน์ 2 มีพาร์ติชันพร้อมพิกัดที่ดัชนี 4?
Olivier Grégoire

เราอาจสมมติว่าแต่ละพื้นที่สามารถวาดได้โดยเริ่มจากพิกัดอ้างอิงตามตัวอย่างที่แนะนำ ฉันเพิ่งรู้ว่าฉันได้รับสิ่งนี้โดยไม่รู้ตัว
Arnauld

คำตอบ:


11

JavaScript (ES7), 166 ไบต์

aล.sอี

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

ม.ยังไม่มีข้อความม.++

ก.n(X,Y)Jผม

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

a[n]a[J]

ก.ม.

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.