行列がテプリッツ行列であるかどうかを確認します


11

2次元の配列と数値が与えられ、与えられた行列がテプリッツかどうかを尋ねられます。

入力フォーマット:

two-dimensional引数として行列を取る関数が与えられます。

出力フォーマット:

1行列がテプリッツの場合は関数から戻り、そうでない場合はを返し-1ます。

制約:

3 < n,m < 10,000,000

ここnで、行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 

得点

これはであるため、バイト単位の最短回答が優先されます。


8
これは良い挑戦ですが、ここではより緩いI / O要件を好みます。デフォルトでプログラムと機能の両方を許可することをお勧めします。そして、True / Falseまたは1/0を出力として許可するか、決定問題に適していると思われる2つの一貫した個別の出力を許可します。
-xnor

15
また、テプリッツ以外のテストケースを含むより多くのテストケースと同様に、テプリッツの定義も適切です。コードを追加することの意味がわかりません。
xnor

5
n、mの最大値を減らす必要があると思います。それ以外の場合、この課題の主な部分は、1テラバイトのマトリックスを処理する方法を見つけることです。
スチューウィーグリフィン

1
行列要素は常に非負の整数ですか?
マーティンエンダー

回答:


7

Mathematica、42バイト

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

Mathematicaには、何かがテプリッツ行列であるかどうかをチェックする組み込み機能はありませんが、生成するには組み込み機能があります。したがって、入力の最初の列(#&@@@#)と最初の行(#&@@#)から1つを生成し、それが入力と等しいかどうかを確認します。True/ Falseresultを1/に変換するには、(またはを与えるために)-1を使用し、単にで結果を変換します。Boole102x-1


6

オクターブ、30バイト

チャレンジで述べているように、1,000,000x1,000,000のマトリックスを処理する必要がないと仮定しています。これは、使用可能なメモリ(私の場合は1 TB未満)を超えない行列に対して機能します。

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

オンラインでお試しください!

これは、x入力として行列を取り、最初の列と最初の行の値に基づいてテプリッツ行列を作成します。次に、行列の各要素が等しいかどうかをチェックします。すべての要素が等しい場合、入力はテプリッツ行列です。

出力は、入力と同じ次元の行列になります。出力にゼロがある場合、それは偽のオクターブと見なされます。

編集:

厳密な出力形式に注意してください。

これは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

Mathematica、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のアルゴリズムに基づく別のアルゴリズム

Mathematica、44バイト

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

2
定義する必要がありますsか?#代わりに使用することはできませんか?
木ではない

はい!あなたが正しいです!
J42161217

3

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

@Neilのおかげで、より効率的なアルゴリズムを使用するというヒントの後-107バイト。

説明:

ここで試してみてください。

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= nおよびc= m)。
ケビンCruijssen

関数にパラメーターとして配列を渡すべきではありませんか?また、これにははるかに効率的なアルゴリズムがあり、バイトカウントが約50%削減されます。
ニール

1
@KevinCruijssen最初の行または列にないすべての要素が、斜め上および左の要素と等しいことを確認します。
ニール

1
ああ、あなたも-->演算子を使用するようになった!
ニール

3

Haskell、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され、最初の要素が削除された最初の要素と2番目の要素が削除された2番目の要素が異なるかどうかがチェックされます。
  • orその後、行のすべてのペアのためのチェックを兼ね備えています。
  • 1-sum[2|...] 出力形式を変換します。

2

JavaScript(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ありがとう、しかし、それは私が問題をもう一度考え過ぎていたことが判明します...-
ニール

2

ルビー、54バイト

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

正確に指定されているように、柔軟な入力/出力が受け入れられれば、より多くのゴ​​ルフをすることができます。

説明:

マトリックスを反復処理し、各行を上の行と比較し、1つ右にシフトします。異なる場合は、次の反復で空の配列を使用します。最後に、最終配列が空の場合は-1を返し、少なくとも2要素の場合は1を返します(可能な最小のマトリックスは3x3であるため、すべての比較がtrueを返す場合、これはtrueです)

オンラインでお試しください!


ニースの使用<=>結果を計算するには!
ニール

どの程度|(*x,_),y|あなたがスライスする必要はありませんので、x
ステファンポッホマン

1

PHP、70バイト

<?=!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)])

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

対角線を次のように位置合わせすることにより、最初にN×(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 # # #

そして、最初の列が単一の一意の番号を含むように繰り返しチェックされ、そうであれば削除されます。出力が空白の場合、行列はテプリッツです。


ああ、負の数では機能しません。これを修正する必要があります:)
eush77

1

MATL、11バイト

T&Xd"@Xz&=v

オンラインでお試しください!

単純明快では「テプリッツ行列を構築し、それに対してチェック」上位のいくつかの答えが使用することを、方法、何とか私には退屈に感じた(とように見えますそれは長い1バイトとにかくだろう)。そこで、「各対角線に1つの一意の値のみが含まれていることを確認する」方法を選びました。

T&Xd -入力の対角線を抽出し、それらを列として使用して新しいマトリックスを作成します(必要に応じてゼロを追加)

" -その列を反復処理する

@Xz -反復変数(現在の列)をプッシュし、ゼロを削除(パディング)します

&=- ブロードキャスト等価チェック -残りのすべての値が互いに等しい場合、すべて1(真)のマトリックスが作成されます。そうでない場合、マトリックスには偽の0が含まれます

v -結果値を連結して、真実(すべて1)または偽(一部0)の最終結果ベクトルを作成します。



0

Clojure、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.