이 파스칼의 매트릭스입니까?


25

에서 파스칼의 삼각형 각 숫자는 0으로 빈 반점을 치료, 바로 위의 두 숫자의 합이다 :

출처 : 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]]. 내 초기 답변은 이것에 대해 부정확하지만 현재의 모든 테스트 사례에는 맞습니다.
케빈 크루이 센

@KevinCruijssen 감사합니다.
Laikoni

답변:


6

Brachylog , 28 24 23 바이트

꽤 오래 느껴지지만 여하튼

  • 옵션 플립을 압축하여 DLosc 덕분에 -4 바이트
  • 1 go에 부분 합계를 수행하여 DLosc 덕분에 -1 바이트

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

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

출력 10그렇지 않으면 파스칼 행렬에 대한 입니다 .

설명

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그리고, 입력 행렬 경우 테스트 midentical으로 any의 회전 Z.


2

, 41 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

F‹¹⌈§θ⁰

첫 번째 행의 최대 값이 1보다 큰 경우

≔⮌θθ

그런 다음 입력 배열을 뒤집습니다.

F‹¹⌈Eθ§ι⁰

첫 번째 열의 최대 값이 1보다 큰 경우

≦⮌θ

그런 다음 입력 배열을 미러링하십시오.

⌊⭆θ⭆ι

입력 배열의 요소를 반복하고 최소 결과 (즉, 모든 결과의 논리적 인 And)를 인쇄합니다.

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

첫 번째 행에있는 경우 각 값을 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

코 틀린 , 269 바이트

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

온라인으로 사용해보십시오!



1

자바 (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==Si==s|j==S.
케빈 크루이 센

더 나은 알고리즘을 알고 있다면 @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.