这是子矩阵吗?


21

这是该挑战的二维概括。

出于我们的目的,如果可以通过从B完全删除许多行和列来获得A,则一个矩阵(或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)。

挑战

你猜到了。给定两个非空整数矩阵AB,确定A是否为B的子矩阵。

您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行自变量或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。

输入可以采用任何方便的格式。可以将矩阵指定为嵌套列表,使用两个不同分隔符的字符串,平面列表以及矩阵的尺寸等,只要输入未经过预处理即可。只要您的选择保持一致,就可以选择B优先,A优先。您可以假设矩阵的元素为正且小于256。

如果AB的子矩阵,则输出应为,否则为f。特定的输出值不必保持一致。

适用标准规则。

测试用例

每个测试用例位于单独的行上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只有这些这些单个字符的“解决方案”,而果冻保持与新的单字符元奇怪我们在内的大多数最左列这里 ...
亚当

Answers:


7

Pyth,10个字节

}CQsyMCMyE

测试套件

这很简单。首先,我们将B视为行列表,并使用来获取所有子集yE。然后,将每个矩阵与进行转置CM,并用取其行的所有子集yM。将这些子列表与串联可以s得到所有可能的转置子矩阵。因此,我们将A与进行转置CQ,并检查A 是否存在}


6

Dyalog APL,53 43字节

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

B←⎕A←⎕提示BA
⍴B, 并为其复制⍴A尺寸,例如→→ 每个坐标系中具有这些尺寸的所有索引… 可能的子矩阵表,其中每个子矩阵都定义为匿名函数的结果… 在一对坐标和之间如果和都是()都是()增加(),则... 返回从行和列的交点创建的submatrix,否则返回一个空向量(A与之不相同的东西)BA
2 3/¨4 5(4 4) (5 5 5)
⍳¨
∘.{}/{}
∧/∊2</¨:∧/∊¨2</
B[⍺;⍵]B
⋄⍬
(⊂A)∊⊃检查是否整个A⊂A)是任何子矩阵()的成员


旧的53字节解决方案:

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

{}一个匿名内联函数,其中左参数为右参数
形状,例如2×3矩阵为2 3
(⍴⍺){}¨⍴⍵对于每对对应的尺寸长度,应用该匿名函数
⍳⍵*2的平方的索引,即2→ 1 2 3 4
(⍵/2)⊤转换为二进制(比特数是维度长度的平方)
{⍵/⍨⍺=+⌿⍵}的二进制表,选择列(⍵/⍨),其中1秒(的数目+⌿⍵)等于电势子矩阵的的该维度的长度(⍺=
↓⍉化妆将表格
v h←存储为v(垂直掩码)和h(水平掩码)的列列表,
然后
h/¨⊂⍵将每个水平掩码应用于正确的参数矩阵
v∘.⌿应用每个垂直蒙版大矩阵的每个水平蒙版版本,
(⊂⍺)∊检查左参数矩阵是否为其成员


3

果冻12 10字节

感谢@Dennis提供-2个字节

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‽假名更长!
亚当

1
@Nᴮᶻ我不是说这是最短的果冻解决方案。
lirtosiast 2016年

1
Z开始时比短Z}。您可以通过建立ZŒP帮助链接来节省更多的字节。
丹尼斯

@Dennis Ok,与Pyth匹配。现在,再打一个字节。
亚当

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)])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.