Bu Pascal'ın Matrisi mi?


25

In Pascal üçgeni her sayı sıfır boş noktalar tedavi, hemen üzerindeki iki sayının toplamı:

Kaynak: https://en.wikipedia.org/wiki/Dosya:Pascal_triangle_small.png

Üçgeni döndürerek, Pascal'ın matrisi olarak adlandırdığım, değişik boyutlarda ve dönüşlerde kare matrisleri kesebiliriz . Bu matrislerin her zaman üst kısmı içermesi gerektiğini unutmayın 1 . İşte bazı örnekler:

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

Görev

Herhangi bir makul formatta pozitif sayılar içeren bir kare matris göz önüne alındığında, Pascal matrisi .

Karar vermek, girişin bir olmasına bağlı olarak gerçeğe uygun ya da sahte değerleri döndürmek anlamına gelir. Pascal matrisi da iki sabit değeri sabitlemek ve biri doğru girişler, diğeri yanlış girişler için döndürmek demektir.

Bu , bu yüzden seçtiğiniz dilde mümkün olduğunca az byte kullanmaya çalışın. Her dilde en kısa kod kazanır, bu yüzden bir cevap kabul etmeyeceğim.

Test durumları

Doğru

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

Yanlış

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

Önerilen test durumu: [[40, 20, 8, 2], [20, 12, 6, 2], [8, 6, 4, 2], [2, 2, 2, 2]]. İlk cevabım bu konuda yanlış bir şekilde doğruydu, ancak mevcut test durumlarının tümü için doğru.
Kevin Cruijssen

@KevinCruijssen Teşekkürler, eklendi.
Laikoni

Yanıtlar:


6

Brachylog , 28 24 23 bayt

Bu oldukça uzun geliyor ama işte yine de

  • İsteğe bağlı kapakları sıkıştırarak DLosc sayesinde -4 bayt
  • DLosc sayesinde tekrar -1 bayt, bir seferde kısmi toplamlar yaparak

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

açıklama

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

Çevrimiçi deneyin!


4

JavaScript (ES6), 114 bayt

m=>[m,m,m=m.map(r=>[...r].reverse()),m].some(m=>m.reverse(p=[1]).every(r=>p=!r.some((v,x)=>v-~~p[x]-~~r[x-1])&&r))

Çevrimiçi deneyin!


4

MATL , 17 bayt

4:"Gas2YLG@X!X=va

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

Çıkışlar 1Pascal matrisleri için,0Aksi halde .

açıklama

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 bayt

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

Çevrimiçi deneyin!

Kötü ...

Kanonik Pascal matrisi oluşturur Zboyutları eşit olan m, daha sonra giriş matris halinde test molduğu identicaliçin anydönme Z.


2

Kömür , 41 bayt

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

Çevrimiçi deneyin!Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

F‹¹⌈§θ⁰

İlk satırın maksimum değeri 1’den büyükse,

≔⮌θθ

daha sonra giriş dizisini çevirin.

F‹¹⌈Eθ§ι⁰

İlk sütununun maksimum değeri 1’den büyükse,

≦⮌θ

daha sonra giriş dizisini yansıtın.

⌊⭆θ⭆ι

Giriş dizisinin öğeleri üzerinde döngü yapın ve minimum sonucu yazdırın (yani tüm sonuçların mantıksal ve Tümü),

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

ilk satırda ise her değerin 1 ile karşılaştırılması, aksi halde yukarıdaki satırın toplamı ile yukarıdaki hücreye dahil edilir.


1

Python 2 , 129 bayt

f=lambda M,i=4:i and(set(M[0])=={1}and all(a+b==c for x,y in zip(M,M[1:])for a,b,c in zip(x[1:],y,y[1:]))or f(zip(*M[::-1]),i-1))

Çevrimiçi deneyin!

İade Truedurumunda Mbaşka bir Pascal Matris olduğunu 0.


1

05AB1E , 29 bayt

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

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

¬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 bayt

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

Çevrimiçi deneyin!



1

Java (JDK) , 234 bayt

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

Çevrimiçi deneyin!

Kredi


1
Güzel cevap, ama bir sürü değişken var. ;) Oh ve -1: i==s||j==Sila i==s|j==S.
Kevin Cruijssen

@KevinCruijssen eğer daha iyi bir algoritma biliyorsanız onu alıyorum! Ancak, dönme tüm değişkenlerin nedenidir. Bazı diller 1-2 baytta işleyebilir, Java'da çevrelerindeki kodu düşünmeniz gerekir. Çekirdek algoritması aslında oldukça kısa: 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 bayt)
Olivier Grégoire

0

Jöle , 22 bayt

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

Çevrimiçi deneyin!

açıklama

Yardımcı bağlantı, bu matris dönüşünün geçerli olup olmadığını kontrol eder

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

Ana link

,Ṛ            | 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.