เป็นไปได้ไหม?


18

ตารางมายากลเป็นn โดย nตารางสี่เหลี่ยมที่เต็มไปด้วยจำนวนเต็มบวกชัดเจนในช่วง1,2, ... n ^ 2เช่นว่าแต่ละเซลล์จะมีจำนวนเต็มที่แตกต่างกันและผลรวมของจำนวนเต็มในแต่ละแถว คอลัมน์และเส้นทแยงมุมเท่ากับ

งานของคุณคือการใช้เมทริกซ์แบบ n-by-nซึ่งประกอบด้วยตัวเลขบวกและตัวยึดตำแหน่งสำหรับเซลล์ว่าง (ฉันจะใช้0แต่คุณสามารถใช้อักขระที่ไม่ใช่ตัวเลขหรือประเภทข้อมูลที่คุณชอบ) และพิจารณาว่าเป็นหรือไม่ เป็นไปได้ที่จะสร้างตารางมายากลโดยการกรอกหมายเลขที่หายไป

เมทริกซ์จะมีอย่างน้อย2 โดย 2และที่มากที่สุด10 โดย 10 ที่เล็กที่สุดตารางมายากลที่เป็นไปได้ไม่น่ารำคาญคือ3 คูณ 3 ตัวเลขในเมทริกซ์อินพุตอาจสูงกว่าn ^ 2และเป็นไปได้ว่าเซลล์ทั้งหมดจะถูกเติมเต็ม

กรณีทดสอบ:

2   2
2   0
False

8   0   6
0   5   0
0   9   2
True

16    2    3   13
 5   11   10    8
 9    7    6   12
 4   14   15    1
True

10   0   1
 0   5   9
 3   7   5
False

99    40    74     8    15    51     0    67     0     1
 0    41    55    14     0    57    64     0    98     0
81    47    56    20    22    63    70    54     0    88
 0    28     0    21     0    69    71    60    85    19
 0    34     0     2     9    75    52    61     0    25
24    65    49     0    90    26    33    42    17    76
 0     0    30    89    91     0    39    48     0    82
 6    72    31    95     0    38    45    29     0    13
12    53     0    96    78     0     0     0    10    94
18    59    43    77     0     0    27    36     0   100
True

อืมมม ผมคิดว่าผมเคยเห็นที่ไหนสักแห่งการแก้ปัญหา ..
แมทธิวต้า

1
กรณีทดสอบที่แนะนำเพื่อให้แน่ใจว่าเส้นทแยงมุมได้รับการทดสอบอย่างถูกต้อง: [ [ 1, 5, 9 ], [ 6, 7, 2 ], [ 8, 3, 4 ] ](เท็จ)
Arnauld

เราสามารถกำหนดหมายเลขตัวแทน (เช่น[[8, X1, 6], [X2, 5, X3], [X4, 9, 2]]) ได้หรือไม่?
Scott Milner

@ สก็อตแน่ใจว่ารู้สึกฟรี ...
Stewie Griffin

คำตอบ:


4

JavaScript (ES6), 270 268 ไบต์

รับเมทริกซ์เป็นอาร์เรย์ 2D ผลตอบแทนหรือ01

a=>(g=(x,y=0,w=a.length,p,R=a[y])=>[0,1,2,3].some(d=>a.some((r,y)=>(p=s)^(s=r.reduce((p,v,x)=>(o|=1<<(v=[v,(b=a[x])[y],b[x++],b[w-x]][d]),p+v),0))&&p),s=o=0)||o/2+1!=1<<w*w?R&&[...Array(w*w)].map((_,n)=>(p=R[x])==++n|!p&&(R[x]=n,g(z=(x+1)%w,y+!z),R[x]=p)):r=1)(r=0)&&r

กรณีทดสอบ

นี่ช้าเกินไปสำหรับกรณีทดสอบครั้งสุดท้าย :-(


2

05AB1E , 45 ไบต์

Zsgn©>‹®L¹˜Kœ0ªε\¹˜0y.;¹gô©O®øO®Å\O®Å/O)˜Ë}à*

00n200

อาจน้อยกว่า 4 ไบต์ แต่ขณะนี้มีข้อผิดพลาดใน builtin .;พร้อมรายการ 2D :และ.:ทำงานได้ตามที่คาดหวัง แต่.;ไม่ได้ทำอะไรเลยในรายการ 2D ตอนนี้ดังนั้นการแก้ไข˜และ¹gôทำให้เมทริกซ์แบน; ใช้.;ในรายการ; และแปลงมันกลับเป็นเมทริกซ์อีกครั้ง

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบบางมากขึ้น (หมายเหตุ: ไม่รวมกรณีทดสอบสุดท้ายของคำอธิบายการท้าทายเนื่องจากมีจำนวน 0 ทางมากเกินไป .. )

คำอธิบาย:

Z               # Get the maximum of the (implicit) input-matrix (implicitly flattened)
                # (and without popping the matrix)
                #  i.e. [[8,0,6],[0,5,0],[0,0,2]] → 8
 s              # Swap to get the input-matrix again
  g             # Get its length (amount of rows)
                #  i.e. [[8,0,6],[0,5,0],[0,0,2]] → 3
   n            # Square it
                #  i.e. 3 → 9
    ©           # Store it in the register (without popping)
     >‹         # Check if the maximum is <= this squared matrix-dimension
                #  i.e. 8 <= 9 → 1 (truthy)
®               # Push the squared matrix-dimension again
 L              # Create a list in the range [1, squared_matrix_dimension]
                #  i.e. 9 → [1,2,3,4,5,6,7,8,9]
  ¹             # Push the input-matrix
   ˜            # Flatten it
                #  i.e. [[8,0,6],[0,5,0],[0,0,2]] → [8,0,6,0,5,0,0,0,2]
    K           # Remove all these numbers from the ranged list
                #  i.e. [1,2,3,4,5,6,7,8,9] and [8,0,6,0,5,0,0,0,2] → [1,3,4,7,9]
œ               # Get all possible permutations of the remaining numbers
                # (this part is the main bottleneck of the program;
                #  the more 0s and too high numbers, the more permutations)
                #   i.e. [1,3,4,7,9] → [[1,3,4,7,9],[1,3,4,9,7],...,[9,7,4,1,3],[9,7,4,3,1]]
 0ª             # Add an item 0 to the list (workaround for inputs without any 0s)
                #  i.e. [[1,3,4,7,9],[1,3,4,9,7],...,[9,7,4,1,3],[9,7,4,3,1]] 
                #   → [[1,3,4,7,9],[1,3,4,9,7],...,[9,7,4,1,3],[9,7,4,3,1],"0"] 
   ε            # Map each permutation `y` to:
    \           #  Remove the implicit `y` which we don't need yet
    ¹˜          #  Push the flattened input again
      0         #  Push a 0
       y        #  Push permutation `y`
        .;      #  Replace all 0s with the numbers in the permutation one by one
                #   i.e. [8,0,6,0,5,0,0,0,2] and [1,3,4,7,9]
                #    → [8,1,6,3,5,4,7,9,2]
          ¹g    #  Push the input-dimension again
            ô   #  And split the flattened list into parts of that size,
                #  basically transforming it back into a matrix
                #   i.e. [8,1,6,3,5,4,7,9,2] and 3 → [[8,1,6],[3,5,4],[7,9,2]]
             ©  #  Save the matrix with all 0s filled in in the register (without popping)
    O           #  Take the sum of each row
                #   i.e. [[8,1,6],[3,5,4],[7,9,2]] → [15,12,18]
    ®øO         #  Take the sum of each column
                #   i.e. [[8,1,6],[3,5,4],[7,9,2]] → [18,15,12]
    ®Å\O        #  Take the sum of the top-left to bottom-right main diagonal
                #   i.e. [[8,1,6],[3,5,4],[7,9,2]] → 15
    ®Å/O        #  Take the sum of the top-right to bottom-left main diagonal
                #   i.e. [[8,1,6],[3,5,4],[7,9,2]] → 18
    )           #  Wrap everything on the stack into a list
                #   → [[15,12,18],[18,15,12],15,18]
     ˜          #  Flatten it
                #   i.e. [[15,12,18],[18,15,12],15,18] → [15,12,18,18,15,12,15,18]
      Ë         #  Check if all values are equal
                #   i.e. [15,12,18,18,15,12,15,18] → 0 (falsey)
}               # After the map:
                #  → [0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
 à              # Check if any are truthy by taking the maximum
                #  → 1 (truthy)
  *             # And multiply the two checks to verify both are truthy
                #  i.e. 1 and 1 → 1 (truthy)
                # (and output the result implicitly)

ส่วนที่©O®øO®Å\O®Å/O)˜Ëยังใช้ในการตอบ 05AB1E ของฉันสำหรับตรวจสอบเมจิกสแควร์ท้าทายเพื่อดูคำตอบว่าสำหรับคำอธิบายเพิ่มเติมในเชิงลึกเกี่ยวกับการเป็นส่วนหนึ่งของรหัสที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.