これは部分行列ですか?


21

これは、この課題の2次元の一般化です

私たちの目的では、Bから行と列の数を完全に削除してAを取得できる場合、1つの行列(または2D配列)Aは別の行列Bの部分行列と見なされます。(注:一部のソースには、異なる/より制限的な定義があります。)

以下に例を示します。

A = [1 4      B = [1 2 3 4 5 6
     2 1]          6 5 4 3 2 1
                   2 1 2 1 2 1
                   9 1 8 2 7 6]

Bから列2、3、5、6および行2、4を削除してAを取得できます。

B = [1 2 3 4 5 6         [1 _ _ 4 _ _         [1 4  = A
     6 5 4 3 2 1   -->    _ _ _ _ _ _   -->    2 1]
     2 1 2 1 2 1          2 _ _ 1 _ _
     9 1 8 2 7 6]         _ _ _ _ _ _]

そのノートAは依然としての部分行列であり、Bのすべての行または列のすべての場合Bが保持される(又は、実際にあればA = B)。

チャレンジ

ご想像の通り。2つの空でない整数行列ABが与えられた場合、ABの部分行列かどうかを判定します。

プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。

入力は任意の便利な形式にすることができます。入力が前処理されていない限り、マトリックスはネストされたリスト、2つの異なるセパレーターを使用した文字列、マトリックスの次元に沿ったフラットリストなどとして指定できます。選択に一貫性がある限り、Bを最初に、Aを 2番目に選択することができます。行列の要素は正で、256未満であると仮定できます。

出力があるべきtruthy場合Aはの部分行列であるBfalsyそう。特定の出力値は一貫している必要はありません。

標準の規則が適用されます。

テストケース

各テストケースは個別の行にありA, Bます。

真実の場合:

[[1]], [[1]]
[[149, 221]], [[177, 149, 44, 221]]
[[1, 1, 2], [1, 2, 2]], [[1, 1, 1, 2, 2, 2], [3, 1, 3, 2, 3, 2], [1, 1, 2, 2, 2, 2]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 7, 6], [7, 8, 9], [1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[228, 66], [58, 228]], [[228, 66], [58, 228]]
[[1, 2], [2, 1]], [[1, 2, 2], [2, 1, 2], [2, 2, 1]]
[[136, 196], [252, 136]], [[136, 252, 210, 196, 79, 222], [222, 79, 196, 210, 252, 136], [252, 136, 252, 136, 252, 136], [180, 136, 56, 252, 158, 222]]

偽のケース:

[[1]], [[2]]
[[224, 15]], [[144, 15, 12, 224]]
[[41], [150]], [[20, 41, 197, 150]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2, 3], [7, 8, 9], [4, 5, 6]]
[[1, 2, 2], [2, 1, 2], [2, 2, 1]], [[1, 2], [2, 1]]
[[1, 2, 2], [2, 1, 2]], [[1, 2], [2, 1], [2, 2]]
[[1, 2], [3, 4]], [[5, 3, 4, 5], [2, 5, 5, 1], [4, 5, 5, 3], [5, 1, 2, 5]]
[[158, 112], [211, 211]], [[158, 211, 189, 112, 73, 8], [8, 73, 112, 189, 211, 158], [211, 158, 211, 158, 211, 158], [21, 158, 199, 211, 212, 8]]

11
これはゼリーの単一のキャラクターだと思います。
アダム

@NᴮᶻもAPLにありませんか?:P
Rɪᴋᴇʀ

@RikerW いいえ、APLはありこれら及びこれらのゼリーは、左端の列のほとんどを含む、新しい単一の文字プリミティブで私たちを驚か保ちながら、単一の文字「ソリューション」をここに ...
アダム・

回答:


7

Pyth、10バイト

}CQsyMCMyE

テストスイート

これはかなり簡単です。まず、Bを行のリストと見なし、を使用してすべてのサブセットを取得しyEます。次に、それらの行列のそれぞれがで転置されCM、すべてのサブセットがでそれらの行から取得されyMます。これらのサブリストを連結するとs、すべての可能な転置されたサブ行列が得られます。したがってCQ、Aをで転置し、が存在するかどうかを確認し}ます。


6

Dyalog APL、53 43バイト

(⊂A)∊⊃∘.{∧/∊2</¨⍺⍵:B[⍺;⍵]⋄⍬}/⍳¨(⍴A←⎕)/¨⍴B←⎕

B←⎕A←⎕のプロンプトBA
⍴B⍴A寸法Bとは、A
それぞれを複製、例えば2 3/¨4 5(4 4) (5 5 5)
⍳¨それらの寸法を有する座標系のそれぞれにおけるすべてのインデックス
∘.{... }/各部分行列が匿名関数の結果として定義されている可能部分行列のテーブル{... }座標の対の間に印加される
∧/∊2</¨:両方の場合(している∧/∊)(両方¨)(増加2</)、そして...
B[⍺;⍵]の戻り部分行列Bの行との交点から作成し、列
⋄⍬他に、空のベクター(Aは同一ではないことを、何かを)返す
(⊂A)∊⊃の全体かどうかを確認A⊂A)はいずれかの部分行列のメンバーです(


古い53バイトのソリューション:

{(⊂⍺)∊v∘.⌿h/¨⊂⍵⊣v h←(⍴⍺){↓⍉⍺{⍵/⍨⍺=+⌿⍵}(⍵/2)⊤⍳⍵*2}¨⍴⍵}

{}匿名のインライン関数。ここで、左引数で右引数の
形状、例えば2行3列の行列の場合は2 3
(⍴⍺){}¨⍴⍵対応する次元長の各ペアでは、この匿名関数の
⍳⍵*22乗、つまり2→ 1つの2 3 4
(⍵/2)⊤バイナリに変換(ビットの数は、寸法、長さの二乗である)
{⍵/⍨⍺=+⌿⍵}バイナリテーブルの、列を(選択⍵/⍨)1の数は、(ここで+⌿⍵)電位部分行列(のその寸法の長さに等しい⍺=
↓⍉メイク列のリストにテーブル
v h←として格納v(erticalマスク)とh(水平マスク)
次に、
h/¨⊂⍵右引数行列に各水平マスクを適用
v∘.⌿大きな行列の水平にマスクされたバージョンの各垂直マスクを適用し
(⊂⍺)∊、左引数行列がそのメンバーであるかどうかをチェックします


3

ゼリー、12 10バイト

-2バイトをありがとう@Dennis

ZŒP
ÇÇ€;/i

@isaacgとほぼ同じアルゴリズムですが、サブセットを取得する前に行列を転置する点が異なります。

ZŒP      Helper link. Input: z
Z          Transpose z
ZŒP        All subsets of columns of z.

ÇÇ€;/i   Main link. Input: B, A. B is a list of rows.
Ç          Call the helper link on B. This is the subsequences of columns of A.
 ǀ        Call the helper link on each column-subsequence.
           Now we have a list of lists of submatrices of B.
   ;/      Flatten that once. The list of submatrices of B.
     i     then get the 1-based index of A in that list.
           If A is not in the list, returns 0.

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


Pyth‽Impostorよりも長い!
アダム

1
@Nᴮᶻこれが最短のゼリーソリューションだとは言いませんでした。
リトシアスト

1
Z開始時はより短いZ}ZŒPヘルパーリンクを作成すると、さらにバイトを節約できます。
デニス

@Dennis OK、それはPythと一致します。ここでもう1バイトゴルフをしましょう。
アダム

3

Mathematica、40 65バイト

!FreeQ[s[# ]&/@(s=Subsets)@#2,# ]&

説明:他の回答のいずれかを参照してください-彼らはすべて同じことをしたように見えます。


3

Brachylog、4バイト

⊇z⊇z

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

入力変数を介してマトリックスBを、出力変数を介してマトリックスAを受け取り、成功または失敗を介して出力します。これは、入力がより暗黙的であり、電源セットの明示的な生成またはメンバーシップのチェックがないことを除いて、Pythソリューションとほとんど同じです。

        B
⊇       has a sublist
 z      which transposed
  ⊇     has a sublist
   z    which transposed
        is A.

1

Haskell、66バイト

import Data.List
t=transpose
s=subsequences
(.((s.t=<<).s)).elem.t

使用例:( (.((s.t=<<).s)).elem.t ) [[149, 221]] [[177, 149, 44, 221]]-> True

非ポイントフリーバージョンは

f a b = elem(transpose a) $ (subsequences.transpose=<<) $ subsequences b

                      subsequences b     -- make all subsequences of b, i.e. all 
                                         -- all combinations of rows removed
     (subsequences.transpose=<<)         -- transpose each such sub-matrix and
                                         -- remove rows again. Concatenate into a
                                         -- single list
elem(transpose a)                        -- check if the transposition of a is in
                                         -- the list

0

パイソン+ numpyの、176の 173バイト

from itertools import*
from numpy import*
def f(A,B):
 r,c=A.shape
 R,C=B.shape
 S=combinations
 print any([all(B[ix_(i,j)]==A)for i in S(range(R),r)for j in S(range(C),c)])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.