เมทริกซ์ Pascal นี้หรือไม่


25

ในรูปสามเหลี่ยมของปาสคาลแต่ละตัวเลขคือผลรวมของตัวเลขสองตัวที่อยู่เหนือมันโดยตรงโดยรักษาจุดว่างเป็นศูนย์:

ที่มา: https://en.wikipedia.org/wiki/File:Pascal_triangle_small.png

โดยการหมุนสามเหลี่ยมเราสามารถตัดเมทริกซ์สี่เหลี่ยมจัตุรัสที่มีขนาดและการหมุนต่างกันซึ่งฉันจะเรียกว่าเมทริกซ์ของปาสคาล โปรดทราบว่าเมทริกซ์เหล่านั้นจำเป็นต้องมี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

งาน

ให้เมทริกซ์จตุรัสที่มีตัวเลขเป็นบวกในรูปแบบที่สมเหตุสมผลพิจารณาว่าเป็นเมทริกซ์ของปาสกาลหรือไม่

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

นี่คือดังนั้นพยายามใช้ให้น้อยที่สุดในภาษาที่คุณเลือก รหัสที่สั้นที่สุดในแต่ละภาษาชนะดังนั้นฉันจะไม่ยอมรับคำตอบ

กรณีทดสอบ

จริง

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

เท็จ

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

[[40, 20, 8, 2], [20, 12, 6, 2], [8, 6, 4, 2], [2, 2, 2, 2]]กรณีทดสอบที่แนะนำ: คำตอบแรกของฉันไม่ถูกต้องสำหรับความจริงข้อนี้ แต่ถูกต้องสำหรับกรณีทดสอบทั้งหมดในปัจจุบัน
Kevin Cruijssen

@KevinCruijssen ขอบคุณที่เพิ่ม
Laikoni

คำตอบ:


6

Brachylog , 28 24 23 ไบต์

มันให้ความรู้สึกค่อนข้างยาว แต่ที่นี่มันก็อยู่ดี

  • -4 ไบต์ต้องขอบคุณ DLosc ด้วยการบีบอัดไฟล์เสริม
  • -1 ไบต์ขอบคุณ DLosc อีกครั้งโดยทำผลรวมบางส่วนใน 1 go

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

คำอธิบาย

{|↔}\↰₁{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

ลองออนไลน์!



4

MATL , 17 ไบต์

4:"Gas2YLG@X!X=va

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

เอาต์พุต1สำหรับ Pascal matrices เป็น0อย่างอื่น

คำอธิบาย

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 ไบต์

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

ลองออนไลน์!

น่ารังเกียจ ...

สร้างเมทริกซ์ที่ยอมรับของปาสคาลZที่มีขนาดเท่ากับว่าmแล้วทดสอบว่าเมทริกซ์การป้อนข้อมูลที่mเป็นidenticalไปของการหมุนของanyZ


2

ถ่าน , 41 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

F‹¹⌈§θ⁰

หากค่าสูงสุดของแถวแรกมากกว่า 1

≔⮌θθ

จากนั้นพลิกอาร์เรย์อินพุต

F‹¹⌈Eθ§ι⁰

หากค่าสูงสุดของคอลัมน์แรกมีค่ามากกว่า 1

≦⮌θ

จากนั้นทำมิเรอร์อาร์เรย์อินพุต

⌊⭆θ⭆ι

วนรอบองค์ประกอบของอินพุตอาร์เรย์และพิมพ์ผลลัพธ์ขั้นต่ำ (เช่นตรรกะและผลลัพธ์ทั้งหมด)

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

เปรียบเทียบแต่ละค่ากับ 1 หากอยู่ในแถวแรกมิฉะนั้นผลรวมของแถวด้านบนจนถึงและรวมเซลล์ข้างต้น



1

05AB1E , 29 ไบต์

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

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

¬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

Java (JDK) , 234 ไบต์

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;}

ลองออนไลน์!

เครดิต


1
คำตอบที่ดี แต่ก็มีตัวแปรมากมาย ;) อ้อและ -1: ไปi==s||j==S i==s|j==S
Kevin Cruijssen

@KevinCruijssen ถ้าคุณรู้ว่าอัลกอริทึมที่ดีกว่าฉันเอามัน! แต่การหมุนเป็นสาเหตุของตัวแปรทั้งหมด บางภาษาสามารถจัดการได้ 1-2 ไบต์ใน Java คุณต้องคิดรหัสรอบ ๆ อัลกอริธึมแกนสั้นจริงๆ: 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 bytes)
Olivier Grégoire

0

เยลลี่ , 22 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ลิงค์ผู้ช่วยตรวจสอบว่าการหมุนของเมทริกซ์นี้ถูกต้องหรือไม่

Ż€            | 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

ลิงค์หลัก

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