マトリックスの行/列にN個の連続した番号がありますか?


20

入力として正の整数と単一の正の整数Nで構成される行列Aを取り、少なくとも内の行または列に同じ数の連続した出現が N個ます。

水平方向と垂直方向のテストのみが必要です。

テストケース

N = 1
A = 
1
Result: True
----------------
N = 3
A = 
1 1 1
2 2 3
Result: True
----------------
N = 4
A = 
1 1 1
2 2 3
Result: False
----------------
N = 3
A = 
3 2 3 4 2 1
4 1 4 2 4 2
4 2 3 3 4 1
1 1 2 2 3 4
3 2 3 1 3 1
1 1 2 2 3 4
Result: True
----------------
N = 1
A = 
5 2 3 8
Result: True
----------------
N = 3
111   23  12    6
111   53   2    5
112  555   5  222
Result: False
----------------
N = 2
 4  2  6  2  1  5
 2  3  3  3  3  3
11 34  4  2  9  7
Result: True

説明は常に良いことです:)


5
マトリックスが好きなようです。
Okx

4
まあ、私はMATLABの男です... Mat rix Lab oratory =)
Stewie Griffin

真実/偽の値を返すのに十分ですか?
デニス

@デニスはもちろんです:)
ウィーグリフィン

5
迷惑なことに、あなたはMatlabの男なので、MATLABで簡単に思える挑戦をしますが、明らかな解決策を除外するわずかなねじれがあります
...-

回答:


7

、9バイト

≤▲mLṁgS+T

2D配列と数値0を受け取り、偽のインスタンスの場合は返し、真実のインスタンスの場合は正の数値を返します。 オンラインでお試しください!

説明

ハスクは関数型言語なので、プログラムは複数の関数の単なる合成です。

≤▲mLṁgS+T
        T  Transpose the array
      S+   and concatenate with original.
           We get a list of the rows and columns of the input array.
    ṁ      Map and concatenate
     g     grouping of equal consecutive elements.
           This gives all consecutive runs on rows and columns.
  mL       Map length over the runs,
 ▲         take the maximum of the results
≤          and see if it's at least the second input.

5

Dyalog APL、27 25 23バイト

{1∊∊⍷∘⍵¨(⊢,⍪¨)⍺/¨⍳⌈/∊⍵}

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

それぞれ-2バイトの@MartinEnderと@Zgarbに感謝します(構成を使用する必要がなくなります w、意味のない括弧)

ゴルフに問題やバイトがある場合、私に注意してください。左引数はN、右引数はAです。

説明:

{1∊∊⍷∘⍵¨(⊢,⍪¨)⍺/¨⍳⌈/∊⍵}
                     ⍵    - Right argument
                    ∊     - Flatten the array
                 ⍳⌈/      - 1 ... the maximum (inclusive)
              ⍺/¨         - Repeat each item ⍺ (left argument) times.
        (⊢,⍪¨)            - Argument concatenated with their transposes.
    ⍷∘⍵¨                  - Do the patterns occur in ⍵?
   ∊                      - Flatten (since we have a vector of arrays)
 1∊                       - Is 1 a member?
{                     }   - Function brackets

4

Perl 6、60バイト

{(@^m|[Z,] @^m).map(*.rotor($^n=>$^n-1).map({[==] $_}).any)}

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

  • @^mは入力行列(最初の引数)で$^nあり、チェックする連続オカレンスの数(2番目の引数)です。
  • [Z,] @^m 入力行列の転置です。
  • (@^m | [Z,] @^m)入力行列とその転置の論理和です。以下は、インボカントのいずれかの行で連続した等しい値が発生したmap場合に、真の値に評価され$^nます。入力行列またはその転置に適用され、入力行列またはその転置の$^nいずれかの行に連続する等しい値が含まれている場合、真の値に評価されます。転置がその条件を満たす場合、それは入力行列の$^n列の1つに連続した等しい値があることを意味します。
  • *.rotor($^n => $^n - 1)各行を$^n-elementスライスのシーケンスに変換します。たとえば、$^nが3で行がの<1 2 2 2 3>場合、これはに評価され(<1 2 2>, <2 2 2>, <2 2 3>)ます。
  • .map({ [==] $_ })各スライスを、スライスのすべての要素が等しいかどうかを示すブール値に変換します。前の例を続けると、これはになり(False, True, False)ます。
  • .any ブール値のそのシーケンスを、ブール値のいずれかが真である場合に真実であるORジャンクションに変換します。

出力は、入力行列またはその転置に$^n連続値が等しい任意の行がある場合に真である、真理値または接合値です。


4

MATL、12バイト

t!YdY'wg)>~a

オンラインでお試しください!または、すべてのテストケースを確認します

説明

非正方行列は、転置に垂直または水平に適切に連結できません。そのため、コードは、ブロック対角行列を作成することにより、それらを対角線で連結します。

結果の行列は、列優先の順序で線形化され、ランレングスエンコードされます。ブロック対角連結から生じるゼロは、実際の値の実行を分離するのに役立ちます。

ランレングスエンコーディングの結果は、値の配列とランレングスの配列です。ゼロ以外の値に対応するランレングスは保持されます。出力は1、これらの長さの一部が入力数以上である場合、および0そうでない場合です。

それを明確にするために中間結果を見てみましょう。入力を考慮する

[10 10 10;
 20 20 30]

そして

3

入力行列とその転置(コードt!Yd)を含むブロック対角行列は次のとおりです。

10 10 10  0  0
20 20 30  0  0
 0  0  0 10 20
 0  0  0 10 20
 0  0  0 10 30

このマトリックスは、列を優先する順序で(下に、次に横に)暗黙的に線形化されます。

10 20  0  0  0 10 20  0  0  0 10 30  0  0  0  0  0 10 10 10  0  0 20 20 30

ランレングスエンコーディング(コード Y')は、次の2つのベクトル(ここでは行ベクトルとして表示されます。実際は列ベクトルです)を提供します。

10 20  0 10 20  0 10 30  0 10  0 20 30

およびランレングスを持つベクトル

1 1 3 1 1 3 1 1 5 3 2 2 1

ゼロ以外の値(コードwg))に対応する長さのみを保持すると、

1 1 1 1 1 1 3 2 1

どの長さが入力数(code >~)以上であるかを比較すると、ベクトルが生成されます

0 0 0 0 0 0 1 0 0

最後に、上記のベクトルに少なくともエントリ(コード)が含まれる場合、出力はtrue(として表示)になります。この場合、結果は1truea

1

4

オクターブ、77 70バイト

@(A,N)any(([x y]=runlength([(p=padarray(A,[1 1]))(:);p'(:)]))(!!y)>=N)

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

説明:マトリックスにはゼロ以外の整数しか含まれていないため、マトリックスの周囲に0の境界線を追加し、マトリックスのランレングスエンコーディングを計算できます(ベクトルに再形成)

@(A,N)any(([x y]=runlength([(p=padarray(A,[1 1]))(:);p'(:)]))(!!y)>=N)
                             p=padarray(A,[1 1])                        % add a border of 0s around the matrix 
                            (                   )(:)                    % reshape the matrix to a column vector
                                                     p'(:)              % transpose of the matrix reshaped to a column vector
                           [                        ;     ]             % concatenate two vectors vertically
           [x y]=runlength(                                )            % runlength encoding of the vector[x=count,y=value]
          (                                                 )           % take x,counts.
                                                             (!!y)      % extrect those counts that their valuse aren't 0
      any(                                                        >=N)  % if we have at least a count that is greater than or equal to N                                                              

3
私はあなたのソリューション(これだけでなく)が本当に好きですが、いくつかの説明から間違いなく恩恵を受けることができます!:)私は、Octaveが持っていた知らなかったrunlength...何か新しい日常...もっと
Stewieグリフィン

思い出させてくれてありがとうrunlength!Matlabに焦点を合わせていたため、オクターブに存在していたことを覚えていませんでした
ルイスメンドー

@StewieGriffinありがとう、目覚めたら答えが更新されました!
-rahnema1

@LuisMendoあなたの投稿の1つの後、私はという名前の関数に気付きましたrunlength
rahnema1

4

ゼリー9 8バイト

;ZjṡƓE€S

行列を引数として受け取り、STDINから整数を読み取ります。

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

使い方

;ZjṡƓE€S  Main link. Argument: M (matrix / row array)

 Z        Zip/transpose M.
;         Concatenate the row array with the column array.
  j       Join the rows and columns, separating by M.
    Ɠ     Read an integer n from STDIN.
   ṡ      Split the result to the left into overlapping slices of length 2.
     E€   Test the members of each resulting array for equality.
       S  Take the sum.

実行例

;ZjṡƓE€S  Argument: [[1, 2], [3, 2]]. STDIN: 2

 Z        [[1, 3], [2, 2]]

;         [[1, 2], [3, 2], [1, 3], [2, 2]]

  j       [1, 2, [1, 2], [3, 2], 3, 2, [1, 2], [3, 2], 1, 3, [1, 2], [3, 2], 2, 2]

    Ɠ     2

   ṡ      [[1, 2],             [2, [1, 2]],        [[1, 2], [3, 2]],   [[3, 2], 3],
           [3, 2],             [2, [1, 2]],        [[1, 2], [3, 2]],   [[3, 2], 1],
           [1, 3],             [3, [1, 2]],        [[1, 2], [3, 2]],   [[3, 2], 2],
           [2, 2]                                                                 ]

     E€   [     0,                       0,                       0,             0,
                0,                       0,                       0,             0,
                0,                       0,                       0,             0,
                1                                                                 ]

       S  1

私は同じ考えを持っていましたが、;Zゼリーではなくジャプで
...-ETHproductions

今、あなたが真実/偽の価値について尋ねた理由がわかりました。Jellyでのその定義は、MATLAB(またはMATL)に触発されたのではありませんか?
スティーヴィーグリフィン

いいえ、JellyはPythonの条件を内部的に使用します。しかし、Ȧ原子はMATLに触発されました。
デニス

まあ私のものはあまりにも長かったです。<右、E組み込みはそれを行う方法でした。ニース:)
HyperNeutrino

3

パイソン260の 92 91バイト

def f(n,x):x=[map(str,i)for i in x];print any(`[i]*n`[1:-1]in`x+zip(*x)`for i in sum(x,[]))

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

カウントする代わりに、サイズn(マトリックス内の各要素)のリストが生成され、マトリックス上にあるかどうかがチェックされます

文字列なし、94バイト

lambda n,x:any((e,)*n==l[i:i+n]for l in x+zip(*x)for i in range(len(l)-n+1)for e in sum(x,()))

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


これは、複数桁の数字で誤検知を引き起こす可能性があると思います。
-xnor

そこに@xnor、修正
ロッド


3

Japt18 15 14バイト

cUy)d_ò¦ d_ʨV

試して

  • ETHproductionsの助けを借りて3バイトを節約しました。

説明

    :Implicit input of 2D array U and integer V
c   :Append to U...
Uy  :U transposed.
d   :Check if any of the elements (sub-arrays) in U return true when...
_   :Passed through a function that...
ò   :Partitions the current element by...
¦   :Checking for inequality.
d   :Check if any of the partitions return true when...
_   :Passed through a function that checks if...
Ê   :The length of the current element...
¨V  :Is greater than or equal to V.
    :Implicit output of resulting boolean.

1
わあ、私の投稿前にこれを見なかった。で2バイトcUy)®ò¦ d_l ¨V\nd、もう1 つでを保存すると、cUy)d_ò¦ d_l ¨V実際に(削除した)ソリューションが得られます。
-ETHproductions

ハハ; 素晴らしい心...、@ ETHproductions :)今日は一日中オバラコンが私を打ち負かした後、私は最速の指であったことにショックを受けました!それらのヒントをありがとう、もう一方をまだ見つけていませんでした。
シャギー

2

CJam、16バイト

q~_z+N*e`:e>0=>!

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

説明

q~    e# Read and eval input.
_z+   e# Append the matrix's transpose to itself.
N*    e# Join with linefeeds to flatten without causing runs across rows.
e`    e# Run-length encode.
:e>   e# Get maximum run (primarily sorted by length).
0=    e# Get its length.
>!    e# Check that it's not greater than the required maximum.

私はいつも、CJamのRLEがランレングスを提供し、それから価値を提供する理由を不思議に思っていました。さて、それはここで役立つことが判明しました:
ルイスメンドー

@LuisMendoそれはあなたが「3 a's、5 b's、2 c's」と言う方法だからだと思います。実際、この順序は非常に頻繁に役立ちます。
マーティンエンダー

実際、Octaveのrunlength関数はその順序でも出力を提供します。しかし、どういうわけか私は注文をvalue, lengthより自然に感じる
ルイスメンドー

2

Pythonの3129の 128 125 120 104 101バイト

@Zachary T、@ Stewie Griffin、@ Mr。Xcoder、@ Rod、@ totallyhumanは、これを大幅に改善してくれました。

def f(n,m):
 a=b=c=0;m+=zip(*m)
 for r in m:
  for i in r:b,a=[1,b+1][a==i],i;c=max(c,b)
 return n<=c

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


1との間にスペースは必要ありませんif
ザカリー

に置き換えることa=b;b=0;c=0で4バイトを節約a=b=c=0
Mr. Xcoder

(私はよく分からない)が、私はあなたが使用できることを考えるm+zip(*m)代わりにm動いて、4行目に、そして完全に1行目を落とすn<=max()と、最後の行にn<=c
ロッド


b=b+1使用の代わりにb+=1 ...ああ、@StewieGriffinによってNinja'd
氏Xcoder

2

05AB1E16 14 12バイト

Døìvyγ€gM²‹_

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

Dø           # Duplicate the input and transpose one copy
  ì          # Combine the rows of both matrixes into one array
   vy        #   For each row...
     γ       #     Break into chunks of the same element
      €g     #     get the length of each chunk
        M    #     Get the largest length so far
         ²‹_ #     Check if that is equal to or longer than required

1
@MagicOctopusUrnどういう意味かわかりません。この例では0、2番目の行に3つの連続したsがあるため、trueになります。
ライリー

@MagicOctopusUrnその実行(TIO)を分割すると、falseが返されます。
ライリー

3番目のコマンドは、転置された行を元の行に連結しませんか?
魔法のタコUr

また、がある場合にのみ3に対してtrueを返すことになっていると思いました[3,3,3]。私はその場合の挑戦を誤解しているので、私はここで間違っていると思います。
魔法のタコUr

@MagicOctopusUrn最初の3つのコマンドは、各行と各列を個別の要素として含む配列を作成します。
ライリー

1

ゼリー、18バイト

ŒrFUm2<⁴$ÐḟL
ZÇo³Ç

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

ŒrFUm2<⁴$ÐḟL  Helper Link
Œr            Run-length encode
  F           Flatten the whole thing, giving the numbers in the odd indices and the lengths of the runs in the even indices
   U          Reverse
    m2        Take every other element (thus only keeping the run lengths)
         Ðḟ   Discard the elements that are
      <⁴$                                   less than the required run length
           L  And find the length
ZÇo³Ç         Main Link
Z             Zip the matrix
 Ç            Call the helper link on it
   ³Ç         Call the helper link on the original matrix
  o           Are either of these truthy?

返品 0偽を、真偽の場合はゼロ以外の整数を返します。

ええ、これは悪いです。そして非常に長い。ゴルフのヒントをいただければ幸いです:)


1

JavaScript(ES6)、99バイト

カリー化構文の行列mと予想される出現回数nを取得します(m)(n)。ブール値を返します。

m=>n=>[',',`(.\\d+?){${m[0].length-1}}.`].some(s=>m.join`|`.match(`(\\b\\d+)(${s}\\1){${n-1}}\\b`))

どうやって?

このコードは特に短くはありませんが、純粋に正規表現に基づいたアプローチを試したかったのです。

行列から文字列への変換

を使用しております m.join('|')2D配列を文字列に変換するします。これにより、最初に、行列の行がコンマ区切りの文字列に暗黙的に強制されます。

たとえば、次の入力:

[
  [ 1, 2, 3 ],
  [ 4, 5, 6 ]
]

に変換されます:

"1,2,3|4,5,6"

行マッチング

次のように連続して出現するものを探します。

/(\b\d+)(,\1){n-1}\b/

これは一致しています:

  • \b 単語の境界
  • \d+ 数字が続く
  • (){n-1}その後n-1回:
    • , コンマ
    • \1 参照:単語の境界+最初の数字
  • \b 単語の境界が続く

列の一致

列内で連続して出現するものを探します:

/(\b\d+)((.\d+?){L-1}.\1){n-1}\b/

ここLで、行の長さです。

これは一致しています:

  • \b 単語の境界
  • \d+ 数字が続く
  • (){n-1}その後n-1回:
    • (){L-1} L-1回:
      • . 任意の文字(実際にはコンマまたはパイプのいずれか)
      • \d+? 数字が続きます(これは欲張りでない必要があります)
    • . 任意の文字が続きます(再び:コンマまたはパイプ)
    • \1 参照:単語の境界+最初の数字
  • \b 単語の境界が続く

テストケース



0

Clojure、77バイト

#((set(for[I[%(apply map vector %)]i I p(partition %2 1 i)](count(set p))))1)

p長さN(記号%2)の連続したパーティションをすべて作成し、個別の値の数をカウントします。次に、これらの長さのセットを形成し、セット1から見つかった場合またはnilそうでない場合に戻ります。forコンストラクトはこれにぴったりでした、私の最初の試みは使用しましたflattenconcatまたはその短い何か。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.