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 código de golfe .
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]]
fonte
Respostas:
Pitão, 10 bytes
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 é transpostaCM
e todos os subconjuntos são tirados de suas linhas comyM
. Concatenar esses sublistas coms
fornece todas as submatrizes transpostas possíveis. Então, transpomos A comCQ
e verificamos se ele está presente}
.fonte
Dyalog APL,
5343 bytesB←⎕
,A←⎕
soliciteB
eA
⍴B
,⍴A
dimensioneB
eA
/¨
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 deB
criada 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 deA
(⊂A
) é membro de∊
qualquer uma das submatrizes (⊃
)Solução antiga de 53 bytes:
{
…}
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 colunasv h←
armazenadas comov
(máscaras erticas) eh
(máscaras horizontais) e⊣
depoish/¨⊂⍵
aplique cada máscara horizontal à matriz de argumentos corretav∘.⌿
aplique cada máscara vertical, cada uma das versões mascaradas horizontalmente da matriz grande,(⊂⍺)∊
verifique se a matriz de argumentos à esquerda é membro delafonte
Gelatina,
1210 bytesObrigado @Dennis por -2 bytes
Quase o mesmo algoritmo que o @isaacg, exceto que transpomos a matriz antes de fazer subconjuntos.
Experimente aqui .
fonte
Z
no começo é mais curto queZ}
. Você pode salvar um byte adicional criandoZŒP
um link auxiliar.Mathematica, 40
65bytesExplicação: Veja uma das outras respostas - parece que todas fizeram a mesma coisa.
fonte
Braquilog , 4 bytes
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.
fonte
Haskell, 66 bytes
Exemplo de uso:
( (.((s.t=<<).s)).elem.t ) [[149, 221]] [[177, 149, 44, 221]]
->True
.Uma versão não-pointfree é
fonte
Python + NumPy,
176173 bytesfonte