Kiểm tra xem một ma trận có phải là ma trận Toeplitz không


11

Bạn sẽ được cung cấp một mảng hai chiều và một số và bạn được yêu cầu tìm xem liệu ma trận đã cho có phải là Toeplitz hay không.

Định dạng đầu vào:

Bạn sẽ được cung cấp một hàm sẽ lấy two-dimensionalma trận làm đối số.

Định dạng đầu ra:

Trả về 1từ hàm nếu ma trận là Toeplitz , khác trả về -1.

Các ràng buộc:

3 < n,m < 10,000,000

trong đó nsố lượng hàng trong khi msẽ là số cột.

Mẫu thử nghiệm:

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 

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


8
Đây là một thách thức tốt, nhưng chúng tôi thích các yêu cầu I / O lỏng lẻo hơn ở đây. Tôi khuyên bạn nên cho phép cả chương trình và chức năng như mặc định . Và để cho phép True / false hoặc 1/0 làm đầu ra, hoặc có lẽ chỉ là bất kỳ hai đầu ra riêng biệt nhất quán nào dường như được ưu tiên cho các vấn đề quyết định.
xnor

15
Ngoài ra, một định nghĩa về Toeplitz sẽ tốt, cũng như nhiều trường hợp thử nghiệm hơn bao gồm cả những trường hợp không phải Toeplitz. Không chắc chắn những gì bạn có ý nghĩa về việc thêm mã.
xnor

5
Tôi nghĩ bạn phải giảm giá trị tối đa của n, m . Mặt khác, phần chính của thử thách này là tìm cách xử lý ma trận 1 terabyte.
Stewie Griffin

1
Các phần tử ma trận sẽ luôn là số nguyên không âm?
Martin Ender

Câu trả lời:


7

Toán học, 42 byte

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

Mathematica không tích hợp sẵn để kiểm tra xem thứ gì đó có phải là ma trận Toeplitz hay không, nhưng nó có tích hợp sẵn để tạo một ma trận hay không. Vì vậy, chúng tôi tạo một từ cột đầu tiên ( #&@@@#) và hàng đầu tiên ( #&@@#) của đầu vào và kiểm tra xem nó có bằng đầu vào không. Để chuyển đổi True/ Falsekết quả để 1/ -1chúng tôi sử dụng Boole(để cung cấp cho 1hoặc 0) và sau đó chỉ cần chuyển đổi kết quả với 2x-1.


6

Octave , 30 byte

Tôi cho rằng tôi không phải xử lý 1.000.000x1.000.000 ma trận như đã nói trong thử thách. Điều này hoạt động cho các ma trận không vượt quá bộ nhớ khả dụng (trong trường hợp của tôi dưới 1 TB).

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

Hãy thử trực tuyến!

Điều này lấy một ma trận xlàm đầu vào và tạo ma trận Toeplitz dựa trên các giá trị trên cột đầu tiên và hàng đầu tiên. Sau đó, nó sẽ kiểm tra từng phần tử của ma trận cho sự bằng nhau. NẾU tất cả các phần tử đều bằng nhau thì đầu vào là ma trận Toeplitz.

Đầu ra sẽ là một ma trận có cùng kích thước với đầu vào. Nếu có bất kỳ số 0 nào trong đầu ra thì đó được coi là giả mạo là Octave.

Biên tập:

Chỉ cần chú ý định dạng đầu ra nghiêm ngặt:

Điều này làm việc cho 41 byte. Có thể đánh golf một hoặc hai byte từ phiên bản này, nhưng tôi hy vọng các quy tắc đầu ra sẽ được nới lỏng một chút.

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


5

05AB1E , 11 byte

Œ2ùvy`¦s¨QP

Hãy thử trực tuyến!

Giải trình

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

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

Hãy thử trực tuyến!


Dang, quá phức tạp một lần nữa. Thật kỳ lạ, tôi nhận được tới 39 byte với đầu ra trung thực / giả, vì vậy nếu Toeplitz = Falseđược cho phép, tôi có thể đã đánh bại nó một byte.
Ørjan Johansen

3

Toán học, 94 byte

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

đầu vào

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

một số khác dựa trên thuật toán của Stewie Griffin

Toán học, 44 byte

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

2
Bạn có cần xác định s? Bạn không thể sử dụng #thay thế?
Không phải là một cái cây

Đúng! bạn đúng rồi!
J42161217

3

Java 7, 239 233 220 113 byte

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 byte sau khi sử dụng thuật toán hiệu quả hơn nhờ @Neil .

Giải trình:

Hãy thử nó ở đây.

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 trong chức năng đầu tiên là gì?
Mickey Jack

@MickeyJack Hàng và cột ( r= nc= mnếu bạn so sánh nó với thử thách).
Kevin Cruijssen

Bạn có nên chuyển mảng dưới dạng tham số cho hàm không? Ngoài ra, có một thuật toán hiệu quả hơn nhiều cho việc này, nó sẽ cắt giảm khoảng 50% số byte của bạn.
Neil

1
@KevinCruijssen Chỉ cần kiểm tra xem tất cả các phần tử không nằm trong hàng hoặc cột đầu tiên bằng phần tử theo đường chéo lên và rời khỏi nó.
Neil

1
Ah, bạn thậm chí phải sử dụng -->toán tử!
Neil

3

Haskell , 51 byte

t lấy danh sách các số nguyên và trả về một số nguyên.

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

Hãy thử trực tuyến!

Điều này có thể đã được 39 hoặc 38 byte với đầu ra trung thực / giả.

Ý tưởng sử dụng initđược lấy cảm hứng từ câu trả lời 05AB1E của Emigna, sử dụng một phương pháp rất giống nhau; trước đó tôi đã sử dụng một nén zing lồng nhau.

Làm thế nào nó hoạt động

  • zipWith((.init).(/=).tail)=<<taillà một hình thức không có điểm \m->zipWith(\x y->tail x/=init y)(tail m)m.
  • Điều này kết hợp từng cặp hàng liên tiếp m, kiểm tra xem phần tử thứ nhất với phần tử thứ nhất bị loại bỏ có khác với phần tử thứ hai với phần tử thứ hai bị loại bỏ hay không.
  • Sau orđó kết hợp kiểm tra cho tất cả các cặp hàng.
  • 1-sum[2|...] chuyển đổi định dạng đầu ra.


2

Ruby , 54 byte

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

Chính xác như được chỉ định, có thể được đánh gôn nhiều hơn nếu đầu vào / đầu ra linh hoạt được chấp nhận.

Giải trình:

Lặp lại trên ma trận và so sánh từng dòng với dòng trên, được dịch chuyển bởi một bên phải. Nếu chúng khác nhau, sử dụng một mảng trống cho lần lặp tiếp theo. Cuối cùng, trả về -1 nếu mảng cuối cùng trống hoặc 1 nếu có ít nhất 2 phần tử (vì ma trận nhỏ nhất có thể là 3x3, điều này đúng nếu tất cả các phép so sánh trả về đúng)

Hãy thử trực tuyến!


Sử dụng tốt đẹp <=>để tính kết quả!
Neil

Làm thế nào về |(*x,_),y|bạn không cần phải cắt x?
Stefan Pochmann


1

Con trăn, 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)])

Không hiệu quả chút nào vì nó chạm vào mọi n+mlần phần tử trong khi lọc các đường chéo. Sau đó kiểm tra nếu có nhiều hơn một yếu tố duy nhất trên mỗi đường chéo.


1

Tiên đề, 121 byte

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 phải là Ma trận của một số phần tử cho phép ~ =; không có nó

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

Võng mạc , 148 byte

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

Hãy thử trực tuyến!

Ma trận đầu vào 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

lần đầu tiên được chuyển đổi thành ma trận N × (N + M-1) bằng cách căn chỉnh các đường chéo theo cách này:

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

và sau đó cột đầu tiên được kiểm tra nhiều lần để chứa một số duy nhất và được loại bỏ nếu điều này là như vậy. Ma trận là Toeplitz nếu đầu ra trống.


Ồ, nó không hoạt động với số âm, phải sửa cái này :)
eush77

1

MATL , 11 byte

T&Xd"@Xz&=v

Hãy thử trực tuyến!

Phương pháp "xây dựng ma trận Toeplitz đơn giản và kiểm tra nó", rằng một vài câu trả lời hàng đầu sử dụng, bằng cách nào đó tôi cảm thấy nhàm chán (và dường như dù sao sẽ dài hơn 1 byte). Vì vậy, tôi đã chọn phương pháp "kiểm tra mỗi đường chéo chỉ chứa một giá trị duy nhất".

T&Xd - Trích xuất các đường chéo của đầu vào và tạo một ma trận mới với chúng dưới dạng các cột (đệm với các số không khi cần thiết)

" - lặp qua các cột của nó

@Xz - đẩy biến lặp (cột hiện tại) và loại bỏ (đệm) các số không khỏi nó

&=- kiểm tra đẳng thức quảng bá - điều này tạo ra một ma trận có tất cả 1 giây (trung thực) nếu tất cả các giá trị còn lại bằng nhau, nếu không thì ma trận chứa một số 0 là sai

v - ghép các giá trị kết quả lại với nhau, để tạo một vectơ kết quả cuối cùng là trung thực (tất cả 1 giây) hoặc falsey (một số 0)



0

Clojure, 94 byte

#(if(=(+ %2 %3 -1)(count(set(for[Z[zipmap][i r](Z(range)%)[j v](Z(range)r)][(- i j)v]))))1 -1)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.