Bir matrisin Toeplitz matrisi olup olmadığını kontrol edin


11

Size iki boyutlu bir dizi ve bir sayı verilecek ve verilen matrisin Toeplitz olup olmadığını bulmanız istenecektir .

Giriş Formatı:

two-dimensionalMatrisi argüman olarak alacak bir fonksiyon verilecektir .

Çıkış biçimi:

1Matris Toeplitz ise işlevden dönün , aksi takdirde geri dönün -1.

Kısıtlamalar:

3 < n,m < 10,000,000

burada nsatır msayısı sütun sayısı olacaktır.

Örnek Test Durumda:

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 

puanlama

Bu , bu yüzden bayttaki en kısa cevap kazanır.


8
Bu iyi bir mücadeledir, ancak burada daha gevşek I / O gereksinimlerini tercih ediyoruz. Hem programlara hem de işlevlere varsayılan olarak izin vermenizi öneririm . Çıktılar olarak Doğru / Yanlış veya 1/0 veya belki de karar problemleri için tercih edilen herhangi iki tutarlı ayrı çıktıya izin vermek .
xnor

15
Ayrıca, Toeplitz'in tanımı, Toeplitz olmayanlar da dahil olmak üzere daha fazla test vakası gibi iyi olacaktır. Kod eklemeyle ilgili ne demek istediğinizden emin değilim.
xnor

5
Bence n, m'nin maksimum değerini azaltmalısınız . Aksi takdirde bu zorluğun ana kısmı 1 terabaytlık bir matrisi işlemek için bir yol bulmaktır.
Stewie Griffin

1
Matris elemanları her zaman negatif olmayan tamsayılar mı olacak?
Martin Ender

Yanıtlar:


7

Mathematica, 42 bayt

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

Mathematica'da bir şeyin Toeplitz matrisi olup olmadığını kontrol etmek için yerleşik bir tane yoktur, ancak bir tane oluşturmak için yerleşik bir özelliği vardır. Bu nedenle , girdinin ilk sütunundan ( #&@@@#) ve ilk satırından ( #&@@#) bir tane oluştururuz ve girdiye eşit olup olmadığını kontrol ederiz . Dönüştürmek için True/ Falsesonucu 1/ -1Kullandığımız Boole(vermek 1veya 0) ve daha sonra basitçe ile sonuca dönüştürmek 2x-1.


6

Oktav , 30 bayt

Meydan okumada söylediği gibi 1.000.000x1.000.000 matrisle uğraşmak zorunda olmadığımı varsayıyorum. Bu, kullanılabilir belleği aşmayan matrisler için geçerlidir (benim durumumda 1 TB'den az).

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

Çevrimiçi deneyin!

Bu, matrisi xgirdi olarak alır ve ilk sütundaki ve ilk satırdaki değerlere dayalı bir Toeplitz matrisi oluşturur. Daha sonra matrislerin her bir elemanını eşitlik açısından kontrol edecektir. Tüm elemanlar eşitse, giriş bir Toeplitz matrisidir.

Çıktı, girdiyle aynı boyutlarda bir matris olacaktır. Çıktıda sıfırlar varsa, o zaman falsili Oktav olarak kabul edilir.

Düzenle:

Sadece katı çıktı formatını fark ettim:

Bu 41 bayt için çalışır. Bu sürümden bir veya iki bayt golf yapmak mümkün olabilir, ancak umarım çıktı kuralları biraz rahatlar.

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


5

05AB1E , 11 bayt

Œ2ùvy`¦s¨QP

Çevrimiçi deneyin!

açıklama

Œ             # 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

4

Haskell , 43 bayt

f(a:b:t)|init a==tail b=f$b:t|1>0= -1
f _=1

Çevrimiçi deneyin!


Dang, tekrar aşırı komplike. İlginç bir şekilde, bunu 39 bayta doğru / falsy çıktısıyla alıyorum, bu yüzden Toeplitz = Falseizin verilirse bir bayt tarafından dövülmüş olabilirim.
Ørjan Johansen

3

Mathematica, 94 bayt

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

giriş

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

diğeri Stewie Griffin'in algoritmasına dayalı

Mathematica, 44 bayt

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

2
Tanımlamanız gerekiyor smu? Onun #yerine sadece kullanamaz mısın?
Bir ağaç değil

Evet! Haklısın!
J42161217

3

Java 7, 239 233 220 113 bayt

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

@Neil sayesinde daha verimli bir algoritma kullandıktan sonra -107 bayt .

Açıklama:

Burada deneyin.

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

ilk fonksiyonda r & c nedir?
Mickey Jack

@MickeyJack Satırlar ve sütunlar ( r= nve c= mmeydan okumayla karşılaştırırsanız).
Kevin Cruijssen

Diziyi işleve parametre olarak iletmemelisiniz? Ayrıca, bunun için çok daha verimli bir algoritma vardır, bu da bayt sayınızı yaklaşık% 50 oranında azaltır.
Neil

1
@KevinCruijssen İlk satırda veya sütunda olmayan tüm öğelerin, öğeyi çapraz olarak yukarı ve soldan eşit olup olmadığını kontrol edin.
Neil

1
Ah, -->operatörü bile kullanmalısın !
Neil

3

Haskell , 51 bayt

t tamsayıların listesini alır ve bir tamsayı döndürür.

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

Çevrimiçi deneyin!

Bu doğruluk / falsy çıkışı ile 39 veya 38 bayt olabilir.

Kullanım fikri initEmigna'nın çok benzer bir yöntem kullanan 05AB1E cevabından ilham aldı; ondan önce yuvalanmış bir fermuar kullandım.

Nasıl çalışır

  • zipWith((.init).(/=).tail)=<<tailnoktadan bağımsız bir biçimidir \m->zipWith(\x y->tail x/=init y)(tail m)m.
  • Bu, her bir ardışık satır çiftini birleştirir m, ilk eleman çıkarılmış olan ilk elemanın ikinci eleman çıkarılmış olan ikinci elemandan farklı olup olmadığını kontrol eder.
  • orDaha sonra tüm satırları çiftleri için denetler birleştirir.
  • 1-sum[2|...] çıktı biçimini dönüştürür.

2

JavaScript (ES6), 65 54 bayt

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

Veya kendi hilenizi kullanarak : a=>a.some(b=>b.some((v,i)=>d[i]-(d[i]=v),d=[,...d]),d=[])?-1:1(62 bayt)
Arnauld

1
@Arnauld Teşekkürler, ama yine de problemi tekrar düşündüğüm ortaya çıkıyor ...
Neil

2

Ruby , 54 bayt

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

Tam olarak belirtildiği gibi, esnek giriş / çıkış kabul edilirse daha fazla golf yapılabilir.

Açıklama:

Matriste yineleyin ve her satırı bir satır sağa kaydırarak yukarıdaki satırla karşılaştırın. Farklıysa, sonraki yineleme için boş bir dizi kullanın. Sonunda, son dizi boşsa -1 veya en az 2 öğe ise 1 değerini döndürün (mümkün olan en küçük matris 3x3 olduğundan, tüm karşılaştırmalar doğruysa bu doğrudur)

Çevrimiçi deneyin!


<=>Sonucu hesaplamak için güzel bir kullanım !
Neil

Peki |(*x,_),y|dilimlemeye gerek yok xmu?
Stefan Pochmann

1

PHP, 70 bayt

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

1

Python, 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)])

Çaprazları n+mfiltrelerken her öğe zamanına değdiği için hiç verimli değil . Ardından, köşegen başına birden fazla benzersiz öğe olup olmadığını kontrol eder.


1

Aksiyom, 121 bayt

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, ~ = 'ya izin veren bir elementin Matrisi olmalıdır; ungolf

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

Retina , 148 bayt

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

Çevrimiçi deneyin!

Bir N × M giriş matrisi

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

önce köşegenleri şu şekilde hizalayarak N × (N + M-1) matrisine dönüştürülür:

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

ve ardından ilk sütun tek bir benzersiz sayı içermek üzere tekrar tekrar kontrol edilir ve bu durumda kaldırılır. Çıktı boşsa matris Toeplitz'dir.


Oh, negatif sayılarla çalışmıyor, bunu düzeltmeliyim :)
eush77

1

MATL , 11 bayt

T&Xd"@Xz&=v

Çevrimiçi deneyin!

En iyi birkaç cevabın kullandığı basit bir "Toeplitz matrisi inşa edin ve buna karşı kontrol edin" yöntemi, bir şekilde bana sıkıcı geldi (ve benziyor) yine de 1 bayt daha uzun ). Bu yüzden "her diyagonalin sadece bir benzersiz değer içerdiğini kontrol et" yöntemi için gittim.

T&Xd - Girişin köşegenlerini çıkarın ve onlarla sütun olarak yeni bir matris oluşturun (gerekirse sıfırlarla doldurma)

" - bunun sütunları arasında yineleme

@Xz - yineleme değişkenini (geçerli sütun) itin ve sıfırları kaldırın (dolgu)

&=- yayın eşitliği kontrolü - kalan tüm değerler birbirine eşitse, 1'lerin hepsiyle (doğruluk) bir matris oluşturur, aksi takdirde matris yanlış olan 0'ları içerir

v - doğruluk (tümü 1s) veya falsey (bazı 0s) olan bir son sonuç vektörü oluşturmak için sonuç değerlerini birleştirin



0

Clojure, 94 bayt

#(if(=(+ %2 %3 -1)(count(set(for[Z[zipmap][i r](Z(range)%)[j v](Z(range)r)][(- i j)v]))))1 -1)
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.