Đây có phải là Ma trận của Pascal không?


25

Trong tam giác của Pascal, mỗi số là tổng của hai số ngay phía trên nó, coi các điểm trống là 0:

Nguồn: https://en.wikipedia.org/wiki/File:Pascal_trigin_small.png

Bằng cách xoay tam giác, chúng ta có thể cắt ra các ma trận vuông có kích thước và góc quay khác nhau mà tôi sẽ gọi là ma trận của Pascal . Lưu ý rằng những ma trận đó luôn cần chứa top . Dưới đây là một số ví dụ:1

1  1  1  1
1  2  3  4
1  3  6 10
1  4 10 20

6  3  1
3  2  1
1  1  1

1  5 15 35 70
1  4 10 20 35
1  3  6 10 15
1  2  3  4  5
1  1  1  1  1

1

1  1
2  1

Nhiệm vụ

Đưa ra một ma trận vuông chứa các số dương ở bất kỳ định dạng hợp lý nào, hãy quyết định xem đó có phải là ma trận của Pascal không .

Quyết định có nghĩa là trả về các giá trị trung thực hoặc sai lệch tùy thuộc vào việc đầu vào là ma trận của Pascal hay để sửa hai giá trị không đổi và trả về một giá trị cho đầu vào đúng và đầu kia cho đầu vào sai.

Đây là , vì vậy hãy cố gắng sử dụng càng ít byte càng tốt trong ngôn ngữ bạn chọn. Mã ngắn nhất trong mỗi ngôn ngữ sẽ thắng, do đó tôi sẽ không chấp nhận câu trả lời.

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

Thật

[[1, 1, 1, 1], [1, 2, 3, 4], [1, 3, 6, 10], [1, 4, 10, 20]]
[[6, 3, 1], [3, 2, 1], [1, 1, 1]]
[[1, 5, 15, 35, 70], [1, 4, 10, 20, 35], [1, 3, 6, 10, 15], [1, 2, 3, 4, 5], [1, 1, 1, 1, 1]]
[[1]]
[[1, 1], [2, 1]]

Sai

[[2]]
[[1, 2], [2, 1]]
[[1, 1], [3, 1]]
[[1, 1, 1, 1], [1, 2, 3, 4], [1, 4, 6, 10], [1, 4, 10, 20]]
[[6, 3, 1], [1, 1, 1], [3, 2, 1]]
[[2, 2, 2, 2], [2, 4, 6, 8], [2, 6, 12, 20], [2, 8, 20, 40]]
[[40, 20, 8, 2], [20, 12, 6, 2], [8, 6, 4, 2], [2, 2, 2, 2]] 
[[1, 5, 15, 34, 70], [1, 4, 10, 20, 34], [1, 3, 6, 10, 15], [1, 2, 3, 4, 5], [1, 1, 1, 1, 1]]

Trường hợp thử nghiệm đề xuất : [[40, 20, 8, 2], [20, 12, 6, 2], [8, 6, 4, 2], [2, 2, 2, 2]]. Câu trả lời ban đầu của tôi là không đúng sự thật cho câu hỏi này, nhưng đúng cho tất cả các trường hợp thử nghiệm hiện tại.
Kevin Cruijssen

@KevinCruijssen Cảm ơn, đã thêm.
Laikoni

Câu trả lời:


6

Brachylog , 28 24 23 byte

Điều này cảm thấy khá dài nhưng đây là dù sao

  • -4 byte nhờ DLosc bằng cách nén các lần lật tùy chọn
  • -1 byte nhờ DLosc một lần nữa bằng cách thực hiện tổng một phần trong 1 đi

{|↔}\↰₁{k{a₀ᶠ+ᵐ}ᵐ⊆?h=₁}

Giải trình

{|↔}\↰₁{k{a₀ᶠ+ᵐ}ᵐ⊆?h=₁}       # Tests if this is a pascal matrix:
{|↔}\↰₁                       #     By trying to get a rows of 1's on top
{|↔}                          #       Through optionally mirroring vertically
     \                        #       Transposing
      ↰₁                      #       Through optionally mirroring vertically

       {k{a₀ᶠ+ᵐ}ᵐ⊆?h=₁}       #     and checking the following
                  ?h=₁        #        first row is a rows of 1's
        k{     }ᵐ             #        and for each row except the last
          a₀ᶠ+ᵐ               #          calculate the partial sum by
          a₀ᶠ                 #             take all prefixes of the input
             +ᵐ               #             and sum each
               ⊆?             #        => as a list is a subsequence of the rotated input

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



4

MATL , 17 byte

4:"Gas2YLG@X!X=va

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Đầu ra 1cho ma trận Pascal, 0nếu không.

Giải trình

4:      % Push [1 2 3 4]
"       % For each
  G     %   Push input: N×N
  a     %   1×N vector containing 1 for matrix columns that have at least a nonzero
        %   entry, and 0 otherwise. So it gives a vector containing 1 in all entries
  s     %   Sum. Gives N
  2YL   %   Pascal matrix of that size
  G     %   Push input
  @     %   Push current iteration index
  X!    %   Rotate the matrix that many times in steps of 90 degress
  X=    %   Are they equal?
  v     %   Concatenate with previous accumulated result
  a     %   Gives 1 if at least one entry of the vector is nonzero
        % End (implicit). Display (implicit)

2

R , 104 byte

function(m,R=row(m)-1,y=nrow(m):1,Z=choose(R+t(R),R))any(sapply(list(Z,Z[,y],Z[y,y],Z[y,]),identical,m))

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

Bẩn thỉu...

Tạo ma trận một kinh điển Pascal Zvới kích thước tương đương với của m, sau đó kiểm tra nếu ma trận đầu vào midenticalđể anycác phép quay của Z.


2

Than , 41 byte

F‹¹⌈§θ⁰≔⮌θθF‹¹⌈Eθ§ι⁰≦⮌θ⌊⭆θ⭆ι⁼λ∨¬κΣ…§θ⊖κ⊕μ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

F‹¹⌈§θ⁰

Nếu tối đa của hàng đầu tiên của nó lớn hơn 1,

≔⮌θθ

sau đó lật mảng đầu vào.

F‹¹⌈Eθ§ι⁰

Nếu tối đa của cột đầu tiên của nó lớn hơn 1,

≦⮌θ

sau đó phản chiếu mảng đầu vào.

⌊⭆θ⭆ι

Lặp lại các phần tử của mảng đầu vào và in kết quả tối thiểu (nghĩa là logic Và của tất cả các kết quả),

⁼λ∨¬κΣ…§θ⊖κ⊕μ

so sánh mỗi giá trị với 1 nếu nó ở hàng đầu tiên, nếu không thì tổng của hàng ở trên lên đến và bao gồm cả ô ở trên.



1

05AB1E , 29 byte

¬P≠iR}DøнP≠ií}¬PΘsü)ε`sηOQ}P*

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

¬Pi }        # If the product of the first row of the (implicit) input-matrix is NOT 1:
    R         #  Reverse the order of the rows
D             # Duplicate the resulting matrix
 øнPi }      # If the product of the first column is NOT 1:
      í       #  Reverse each row individually
¬PΘ           # Check if the product of the first row is exactly 1
           *  # AND
          P   # And check if everything after the following map is truthy:
sü)ε     }    #  Map over each pair of rows:
    `sη       #   Get the prefixes of the first row
       O      #   Sum each prefix
        Q     #   And check if it's equal to the second row
              # (and output the result implicitly)

1

Kotlin , 269 byte

{m:List<List<Int>>->val n=m.size
var r=0
var c=0
fun f()=if(m[0][0]!=1)m[n-r-1][n-c-1]
else if(m[n-1][0]!=1)m[r][n-c-1]
else if(m[0][n-1]!=1)m[n-r-1][c]
else m[r][c]
var g=0<1
for(l in 0..n*2-2){r=l
c=0
var v=1
do{if(r<n&&c<n)g=f()==v&&g
v=v*(l-c)/++c}while(--r>=0)}
g}

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



1

Java (JDK) , 234 byte

m->{int l=m.length,L=l-1,p=1,s=0,S=0,e=l,E=l,d=1,D=1,i,j;if(m[0][0]>1|m[0][L]>1){s=L;e=d=-1;}if(m[0][0]>1|m[L][0]>1){S=L;E=D=-1;}for(i=s;i!=e;i+=d)for(j=S;j!=E;j+=D)p=(i==s|j==S?m[i][j]<2:m[i][j]==m[i-d][j]+m[i][j-D])?p:0;return p>0;}

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

Tín dụng


1
Câu trả lời hay, nhưng dang, vô số biến. ;) Ồ, và -1: i==s||j==Sđến i==s|j==S.
Kevin Cruijssen

@KevinCruijssen nếu bạn biết một thuật toán tốt hơn tôi sẽ dùng nó! Nhưng vòng quay là nguyên nhân cho tất cả các biến. Một số ngôn ngữ có thể xử lý chúng trong 1-2 byte, trong Java, bạn phải nghĩ mã xung quanh chúng. Thuật toán cốt lõi thực sự khá ngắn: m->{int l=m.length,i=0,j;for(;i<l;i++)for(j=0;j<l;j++)p=(i<1|j<1?m[i][j]<2:m[i][j]==m[i-1][j]+m[i][j-1])?p:0;return p>0;}(122 byte)
Olivier Grégoire

0

Thạch , 22 byte

Ż€Iṫ2⁼ṖaFḢ=1Ʋ
,Ṛ;U$Ç€Ẹ

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

Giải trình

Liên kết trợ giúp, kiểm tra xem vòng quay ma trận này có hợp lệ không

Ż€            | prepend each row with zero
  I           | find differences within rows
   ṫ2         | drop the first row
     ⁼Ṗ       | compare to the original matrix
              |   with the last row removed
       a      | logical and
        FḢ=1Ʋ | top left cell is 1

Liên kết chính

,Ṛ            | copy the matrix and reverse the rows
  ;U$         | append a copy of both of these
              |   with the columns reversed
     ǀ       | run each version of the matrix
              |   through the helper link
       Ẹ      | check if any are valid
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.