Là ma thuật có thể?


18

Hình vuông ma thuật là một ô vuông n-by-n , chứa đầy các số nguyên dương riêng biệt trong phạm vi 1,2, ... n ^ 2 , sao cho mỗi ô chứa một số nguyên khác nhau và tổng các số nguyên trong mỗi hàng, cột và đường chéo bằng nhau.

Nhiệm vụ của bạn là lấy một ma trận n-by-n bao gồm các số dương và một ký tự giữ chỗ cho các ô trống (Tôi sẽ sử dụng 0 , nhưng bạn có thể sử dụng bất kỳ ký tự hoặc kiểu dữ liệu nào bạn muốn) và xác định xem nó có phải là số không có thể tạo ra một hình vuông ma thuật bằng cách điền vào những con số còn thiếu

Ma trận sẽ có ít nhất 2 nhân 2 và nhiều nhất là 10 nhân 10 . Hình vuông ma thuật không tầm thường nhỏ nhất có thể là 3 nhân 3 . Các số trong ma trận đầu vào có thể cao hơn n ^ 2 và có thể tất cả các ô đều được điền.

Các trường hợp thử nghiệm:

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

Hừm. Tôi nghĩ rằng tôi đã thấy một giải pháp ở đâu đó ..
Matthew Roh

1
Trường hợp kiểm tra được đề xuất để đảm bảo rằng các đường chéo được kiểm tra chính xác: [ [ 1, 5, 9 ], [ 6, 7, 2 ], [ 8, 3, 4 ] ](giả mạo)
Arnauld

Chúng tôi có thể đánh số các giữ chỗ (tức là [[8, X1, 6], [X2, 5, X3], [X4, 9, 2]])?
Scott Milner

@ Hủy bỏ chắc chắn, cảm thấy tự do ...
Stewie Griffin

Câu trả lời:


4

JavaScript (ES6), 270 268 byte

Đưa ma trận thành một mảng 2D. Trả về 0hoặc 1.

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

Các trường hợp thử nghiệm

Điều này chắc chắn là quá chậm cho trường hợp thử nghiệm cuối cùng. :-(


2

05AB1E , 45 byte

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

00n200 giây).

Có thể có ít hơn 4 byte, nhưng hiện tại có một lỗi trong phần dựng sẵn .;với danh sách 2D. :.:làm việc như mong đợi, nhưng .;không làm bất cứ điều gì trong danh sách 2D ngay bây giờ .. do đó, công việc xung quanh ˜¹gô làm phẳng ma trận; sử dụng .;trong danh sách; và biến nó trở lại thành ma trận một lần nữa.

Dùng thử trực tuyến hoặc xác minh một số trường hợp thử nghiệm . (LƯU Ý: Không bao gồm trường hợp thử nghiệm cuối cùng của mô tả thử thách, vì nó có quá nhiều 0 ..)

Giải trình:

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)

Phần ©O®øO®Å\O®Å/O)˜Ënày cũng được sử dụng trong câu trả lời 05AB1E của tôi cho thử thách Xác minh Magic Magic Square , vì vậy hãy xem câu trả lời đó để được giải thích sâu hơn về phần đó của mã.

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.