Isso é uma submatriz?

21

Esta é a generalização bidimensional deste desafio .

Para os nossos objectivos, uma matriz (ou matriz 2D) Um é considerada uma submatriz de uma outra matriz B , se A pode ser obtido por remoção por completo um número de linhas e colunas de B . (Nota: algumas fontes têm definições diferentes / mais restritivas.)

Aqui está um exemplo:

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]

Podemos excluir as colunas 2, 3, 5, 6 e as linhas 2, 4 de B para obter 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]         _ _ _ _ _ _]

Observe que A ainda é uma submatriz de B se todas as linhas ou colunas de B forem mantidas (ou, de fato, se A = B ).

O desafio

Você adivinhou. Dado número inteiro de dois não-vazia matrizes A e B , determinar se uma é uma submatriz de B .

Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).

A entrada pode estar em qualquer formato conveniente. As matrizes podem ser fornecidas como listas aninhadas, seqüências de caracteres usando dois separadores diferentes, listas simples, juntamente com as dimensões da matriz, etc., desde que a entrada não seja pré-processada. Você pode escolher entre B primeiro e A segundo, desde que sua escolha seja consistente. Você pode assumir que os elementos das matrizes são positivos e inferiores a 256.

A saída deve ser verdadeira se A for uma submatriz de B e, caso contrário, será falso . O valor de saída específico não precisa ser consistente.

Aplicam-se as regras padrão de .

Casos de teste

Cada caso de teste está em uma linha separada A, B,.

Casos verdadeiros:

[[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]]

Casos de falsidade:

[[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]]
Martin Ender
fonte
11
Suponho que esse seja um personagem único em Jelly.
Adám 9/03/16
@ Nᴮᶻ não no APL também? : P
Rɪᴋᴇʀ
@RikerW Não , a APL tem apenas estes e estas de caráter único "soluções", enquanto Jelly mantém nos surpreender com novas primitivas de caracteres individuais, incluindo a maior parte da coluna mais à esquerda aqui ...
Adám

Respostas:

7

Pitão, 10 bytes

}CQsyMCMyE

Suíte de teste

Isso é bastante direto. Primeiro, consideramos B como uma lista de linhas e usamos todos os subconjuntos yE. Em seguida, cada uma dessas matrizes é transposta CMe todos os subconjuntos são tirados de suas linhas com yM. Concatenar esses sublistas com sfornece todas as submatrizes transpostas possíveis. Então, transpomos A com CQe verificamos se ele está presente }.

isaacg
fonte
6

Dyalog APL, 53 43 bytes

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

B←⎕, A←⎕solicite Be A
⍴B, ⍴Adimensione Be A
replique cada um, por exemplo, 2 3/¨4 5(4 4) (5 5 5)
⍳¨todos os índices em cada um dos sistemas de coordenadas com essas dimensões
∘.{... }/tabela de possíveis submatrizes, em que cada submatriz é definida como resultado da função anônima {... }aplicada entre um par de coordenadas e
∧/∊2</¨:se both e are ( ∧/∊) both ( ¨) estão aumentando ( 2</), então ...
B[⍺;⍵]retorna a submatriz de Bcriada a partir das interseções de linhas e colunas
⋄⍬, retorna um vetor vazio (algo que A não é idêntico)
(⊂A)∊⊃verifica se o conjunto de A(⊂A) é membro de qualquer uma das submatrizes ( )


Solução antiga de 53 bytes:

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

{}Uma função anônima inline, onde fica o argumento esquerdo e o
formato correto do argumento , por exemplo, 2 3 para uma matriz 2 por 3
(⍴⍺){}¨⍴⍵para cada par de comprimentos de dimensão correspondentes, aplique esses
⍳⍵*2índices de função anônima do quadrado de, ou seja, 2 → 1 2 3 4
(⍵/2)⊤convertido ao binário (número de bits é dimensão de comprimento ao quadrado)
{⍵/⍨⍺=+⌿⍵}da tabela binia, seleccionar as colunas ( ⍵/⍨) onde o número de 1s ( +⌿⍵) é igual ao do comprimento da referida dimensão na submatriz potencial ( ⍺=)
↓⍉fazer tabela na lista de colunas
v h←armazenadas como v(máscaras erticas) e h(máscaras horizontais) e
depois
h/¨⊂⍵aplique cada máscara horizontal à matriz de argumentos correta
v∘.⌿aplique cada máscara vertical, cada uma das versões mascaradas horizontalmente da matriz grande,
(⊂⍺)∊verifique se a matriz de argumentos à esquerda é membro dela

Adão
fonte
3

Gelatina, 12 10 bytes

Obrigado @Dennis por -2 bytes

ZŒP
ÇÇ€;/i

Quase o mesmo algoritmo que o @isaacg, exceto que transpomos a matriz antes de fazer subconjuntos.

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.

Experimente aqui .

lirtosiast
fonte
Mais tempo que Pyth‽ Impostor!
Adám
11
@ Nᴮᶻ Eu não disse que esta era a solução Jelly mais curta.
precisa saber é
11
Zno começo é mais curto que Z}. Você pode salvar um byte adicional criando ZŒPum link auxiliar.
Dennis
@ Dennis Ok, isso corresponde a Pyth. Agora jogue fora mais um byte.
Adám
3

Mathematica, 40 65 bytes

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

Explicação: Veja uma das outras respostas - parece que todas fizeram a mesma coisa.

feersum
fonte
3

Braquilog , 4 bytes

⊇z⊇z

Experimente online!

Leva a matriz B através da variável de entrada e a matriz A através da variável de saída e produz através de sucesso ou falha. Essa é praticamente a solução Pyth, exceto que a entrada é mais implícita e não há geração explícita ou verificação de associação para os conjuntos de potências.

        B
⊇       has a sublist
 z      which transposed
  ⊇     has a sublist
   z    which transposed
        is A.
String não relacionada
fonte
1

Haskell, 66 bytes

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

Exemplo de uso: ( (.((s.t=<<).s)).elem.t ) [[149, 221]] [[177, 149, 44, 221]]-> True.

Uma versão não-pointfree é

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
nimi
fonte
0

Python + NumPy, 176 173 bytes

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)])
Karl Napf
fonte