행렬이 Toeplitz 행렬인지 확인


11

2 차원 배열과 숫자가 주어지며 주어진 행렬이 Toeplitz 인지 여부를 묻습니다 .

입력 형식 :

two-dimensional행렬을 인수로 취하는 함수가 제공됩니다 .

출력 형식:

1행렬이 Toeplitz 이면 함수에서 반환 하고 그렇지 않으면를 반환 -1합니다.

제약 사항 :

3 < n,m < 10,000,000

여기서 nm수는 열 수입니다.

샘플 테스트 사례 :

Sample Input :
4 
5
6 7 8 9 2
4 6 7 8 9
1 4 6 7 8
0 1 4 6 7 

Sample Output : 
1 

채점

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


8
이것은 좋은 과제이지만 여기서는 laxer I / O 요구 사항을 선호합니다. 프로그램과 기능 모두 기본값으로 허용하는 것이 좋습니다 . 그리고 True / False 또는 1/0을 출력으로, 또는 결정 문제에 선호되는 것으로 보이는 두 개의 일관된 별개의 출력을 허용 합니다.
xnor

15
또한 Toeplitz 이외의 사례를 포함하여 더 많은 테스트 사례가 있으므로 Toeplitz의 정의가 좋습니다. 코드 추가에 대해 무슨 뜻인지 잘 모르겠습니다.
xnor

5
최대 값 n, m을 줄여야한다고 생각합니다 . 그렇지 않으면이 문제의 주요 부분은 1 테라 바이트 매트릭스를 처리하는 방법을 찾는 것입니다.
Stewie Griffin

1
행렬 요소는 항상 음이 아닌 정수입니까?
마틴 엔더

답변:


7

수학, 42 바이트

2Boole[#==ToeplitzMatrix[#&@@@#,#&@@#]]-1&

Mathematica에는 Toeplitz 매트릭스인지 확인하기위한 내장 기능이 없지만이를 생성하기위한 내장 기능이 있습니다. 따라서 입력의 첫 번째 열 ( #&@@@#)과 첫 번째 행 ( #&@@#) 에서 하나를 생성 하고 입력과 같은지 확인합니다. True/ False결과를 1/ 로 변환하려면 ( 또는 ) 를 -1사용 하고 결과를 간단히 변환하십시오 .Boole102x-1


6

옥타브 , 30 바이트

나는 도전에서 말하는 것처럼 1,000,000x1,000,000 행렬을 처리 할 필요가 없다고 가정합니다. 이것은 사용 가능한 메모리를 초과하지 않는 매트릭스 (제 경우에는 1TB 미만)에 적용됩니다.

@(x)x==toeplitz(x(:,1),x(1,:))

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

행렬 x을 입력으로 사용하여 첫 번째 열과 첫 번째 행의 값을 기반으로 Toeplitz 행렬을 만듭니다. 그런 다음 행렬의 각 요소가 동일한 지 확인합니다. 모든 요소가 같으면 입력은 Toeplitz 행렬입니다.

출력은 입력과 동일한 차원의 행렬이됩니다. 출력에 0이있는 경우 허위는 옥타브로 간주됩니다.

편집하다:

엄격한 출력 형식을 보았습니다.

이것은 41 바이트에서 작동합니다. 이 버전에서 1 ~ 2 바이트 정도 골프를 치는 것이 가능할 수도 있지만 출력 규칙이 약간 완화되기를 바랍니다.

@(x)2*(0||(x==toeplitz(x(:,1),x(1,:))))-1


5

05AB1E , 11 바이트

Œ2ùvy`¦s¨QP

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

설명

Œ             # get all sublists of input
 2ù           # keep only those of length 2
   v          # for each such pair
    y`        # split to separate lists
      ¦       # remove the first element of the second list
       s¨     # remove the last element of the first list
         Q    # compare for equality
          P   # product of stack


3

수학, 94 바이트

l=Length;If[l@Flatten[Union/@Table[#~Diagonal~k,{k,-l@#+1,l@#[[1]]-1}]]==l@#+l@#[[1]]-1,1,-1]&

입력

{{6, 7, 8, 9, 2}, {4, 6, 7, 8, 9}, {1, 4, 6, 7, 8}, {0, 1, 4, 6, 7}}

Stewie Griffin 의 알고리즘 에 기반한 또 하나

매스 매 티카, 44 바이트

If[#==#[[;;,1]]~ToeplitzMatrix~#[[1]],1,-1]&

2
정의해야 s합니까? #대신 사용할 수 없습니까 ?
나무가 아님

예! 당신이 맞아요!
J42161217

3

자바 7 239 233 220 113 바이트

int c(int[][]a){for(int i=a.length,j;i-->1;)for(j=a[0].length;j-->1;)if(a[i][j]!=a[i-1][j-1])return -1;return 1;}

-107에 대한보다 효율적인 알고리즘 덕분에 사용하는 팁 후 바이트 @Neil을 .

설명:

여기에서 시도하십시오.

int c(int[][]a){                // Method with integer-matrix parameter and integer return-type
  for(int i=a.length,j;i-->1;)  //  Loop over the rows (excluding the first)
    for(j=a[0].length;j-->1;)   //   Loop over the columns (excluding the first)
      if(a[i][j]!=a[i-1][j-1])  //    If the current cell doesn't equal the one top-left of it:
        return -1;              //     Return -1
                                //   End of columns loop (implicit / single-line body)
                                //  End of rows loop (implicit / single-line body)
  return 1;                     //  Return 1
}                               // End of method

첫 번째 함수에서 r & c는 무엇입니까?
미키 잭

@MickeyJack 행과 열 (챌린지와 비교할 경우 r= nc= m)
Kevin Cruijssen

배열을 매개 변수로 함수에 전달해서는 안됩니까? 또한 훨씬 효율적인 알고리즘이 있으므로 바이트 수를 약 50 % 줄입니다.
Neil

1
@KevinCruijssen 첫 번째 행이나 열에없는 모든 요소가 요소의 대각선 위와 왼쪽에 있는지 확인하십시오.
Neil

1
아, 당신은 심지어 -->연산자 를 사용해야합니다 !
Neil

3

하스켈 , 51 바이트

t 정수 목록을 가져 와서 정수를 반환합니다.

t m=1-sum[2|or$zipWith((.init).(/=).tail)=<<tail$m]

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

사실 / 거짓 출력으로 39 또는 38 바이트 일 수 있습니다.

사용할 아이디어 init는 Emigna의 05AB1E 답변에서 영감을 얻었으며 매우 유사한 방법을 사용합니다. 그 전에 중첩 된 압축을 사용했습니다.

작동 원리

  • zipWith((.init).(/=).tail)=<<tail의 무료 포인트 형식입니다 \m->zipWith(\x y->tail x/=init y)(tail m)m.
  • 이것은 행의 각 연속 쌍을 결합 m하여 첫 번째 요소가 제거 된 첫 번째 요소와 두 번째 요소가 제거 된 두 번째 요소가 다른지 확인합니다.
  • 그런 or다음 모든 행 쌍에 대한 검사를 결합합니다.
  • 1-sum[2|...] 출력 형식을 변환합니다.

2

자바 스크립트 (ES6), 65 54 바이트

a=>a.some((b,i)=>i--&&b.some((c,j)=>c-a[i][j-1]))?-1:1

또는 자신의 트릭을 사용하여 : a=>a.some(b=>b.some((v,i)=>d[i]-(d[i]=v),d=[,...d]),d=[])?-1:1(62 바이트)
Arnauld

1
@Arnauld 감사합니다,하지만 문제를 다시 생각하고 있었음이 밝혀졌습니다 ...
Neil

2

루비 , 54 바이트

->a,b,m{m.reduce{|x,y|x[0..-2]==y[1,b]?y:[]}.size<=>1}

유연한 입력 / 출력이 허용되면 정확하게 지정된대로 더 골프를 칠 수 있습니다.

설명:

행렬을 반복하고 각 줄을 위의 줄과 오른쪽으로 한 칸씩 비교합니다. 서로 다르면 다음 반복에 빈 배열을 사용하십시오. 마지막으로, 최종 배열이 비어 있으면 -1을 반환하고, 최소 2 개의 요소 인 경우 1을 반환합니다 (가능한 가장 작은 행렬이 3x3이므로 모든 비교가 true를 반환하면 true 임)

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


의 좋은 사용 <=>결과를 계산하기!
Neil

방법에 대해 |(*x,_),y|당신이 슬라이스 필요가 없습니다 x?
Stefan Pochmann

1

PHP, 70 바이트

<?=!preg_match('/\[([\d,]+?),\d+\],\[\d+,(?!\1)/',json_encode($_GET));

1

파이썬, 108

r=range
f=lambda x,n,m:all([len(set([x[i][j] for i in r(n) for j in r(m) if j-i==k]))==1 for k in r(1-n,m)])

n+m대각선을 필터링하는 동안 모든 요소 시간에 닿기 때문에 전혀 효율적이지 않습니다 . 그런 다음 대각선 당 하나 이상의 고유 한 요소가 있는지 확인합니다.


1

공리, 121 바이트

f(m)==(r:=nrows(m);c:=ncols(m);for i in 1..r-1 repeat for j in 1..c-1 repeat if m(i,j)~=m(i+1,j+1)then return false;true)

m은 ~ =를 허용하는 일부 요소의 행렬이어야합니다. 그것을 풀다

f m ==
  r := nrows(m)
  c := ncols(m)
  for i in 1..(r - 1) repeat
    for j in 1..(c - 1) repeat
      if m(i,j)~=m(i + 1,j + 1)     then return(false)
  true

1

레티 나 148 바이트

m(1`\d+
$*#
1`#\n\d+\n
@
+`(#*)#@([^#\n]*(#*)\n)(.*)$
$1# $2$1@$4 #$3
@

+`##
# #
+(+s`^(\d+)\b(.*)^\1\b
$1$2#
s`.*^\d.*^\d.*
-1
)%`^[^- ]+ ?

\s+
1

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

N × M 입력 행렬

6 7 8 9 2 0
4 6 7 8 9 2
1 4 6 7 8 9
0 1 4 6 7 8

먼저 대각선을 다음과 같이 정렬하여 Nx (N + M-1) 행렬로 변환됩니다.

# # # 6 7 8 9 2 0
# # 4 6 7 8 9 2 #
# 1 4 6 7 8 9 # #
0 1 4 6 7 8 # # #

그런 다음 첫 번째 열에 단일 고유 번호가 포함되어 있는지 반복적으로 확인하고이 경우 제거합니다. 출력이 공백 인 경우 행렬은 Toeplitz입니다.


아, 그것은 음수로 작동하지 않습니다, 이것을 고쳐야합니다 :)
eush77

1

MATL , 11 바이트

T&Xd"@Xz&=v

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

간단한 답변은 "Toeplitz 매트릭스를 구성하고 확인하십시오"방법으로, 몇 가지 최상위 답변이 사용하는 것이 어쨌든 지루하다고 느꼈습니다 (그리고 어쨌든 1 바이트 더 길어 보입니다 ). 그래서 "각 대각선에 하나의 고유 한 값만 포함되어 있는지 확인"방법으로 넘어갔습니다.

T&Xd -입력의 대각선을 추출하여 열로 새 행렬을 만듭니다 (필요에 따라 0으로 채워짐)

" -그 열을 반복

@Xz -반복 변수 (현재 열)를 푸시하고 0을 제거 (패딩)

&=- 브로드 캐스트 평등 검사 -나머지 모든 값이 서로 같으면 모두 1 (무성한)로 행렬을 생성합니다. 그렇지 않으면 행렬에 0이 포함됩니다.

v -결과 값을 함께 연결하여 진실 (1) 또는 거짓 (일부 0) 인 하나의 최종 결과 벡터를 생성합니다.



0

클로저, 94 바이트

#(if(=(+ %2 %3 -1)(count(set(for[Z[zipmap][i r](Z(range)%)[j v](Z(range)r)][(- i j)v]))))1 -1)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.