Est-ce une sous-matrice?

21

Il s'agit de la généralisation bidimensionnelle de ce défi .

Pour nos besoins, une matrice (ou réseau 2D) A est considéré comme un sous - matrice d' une autre matrice B , si A peut être obtenue en retirant complètement un certain nombre de lignes et de colonnes de B . (Remarque: certaines sources ont des définitions différentes / plus restrictives.)

Voici un exemple:

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]

Nous pouvons supprimer les colonnes 2, 3, 5, 6 et les lignes 2, 4 de B pour obtenir 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]         _ _ _ _ _ _]

Notez que A est toujours une sous-matrice de B si toutes les lignes ou toutes les colonnes de B sont conservées (ou en fait si A = B ).

Le défi

Tu l'as deviné. Compte tenu de deux matrices entier non vide A et B , déterminer si un est une sous - matrice de B .

Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), une valeur de retour de fonction ou un paramètre de fonction (out).

L'entrée peut être dans n'importe quel format pratique. Les matrices peuvent être données sous forme de listes imbriquées, de chaînes utilisant deux séparateurs différents, de listes plates avec les dimensions de la matrice, etc., tant que l'entrée n'est pas prétraitée. Vous pouvez choisir de prendre B en premier et A en second tant que votre choix est cohérent. Vous pouvez supposer que les éléments des matrices sont positifs et inférieurs à 256.

La sortie doit être véridique si A est une sous-matrice de B et fausse sinon. Il n'est pas nécessaire que la valeur de sortie spécifique soit cohérente.

Les règles de standard s'appliquent.

Cas de test

Chaque cas de test est sur une ligne distincte, A, B.

Cas véridiques:

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

Cas de falsification:

[[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
la source
11
Je suppose que c'est un seul personnage de Jelly.
Adám
@ Nᴮᶻ pas aussi dans APL? : P
Rɪᴋᴇʀ
@RikerW Non , APL n'a que ces et ces "solutions" à caractère unique, tandis que Jelly continue de nous surprendre avec de nouvelles primitives à caractère unique, y compris la plupart de la colonne la plus à gauche ici ...
Adám

Réponses:

7

Pyth, 10 octets

}CQsyMCMyE

Suite de tests

C'est assez simple. Tout d'abord, nous considérons B comme une liste de lignes et prenons tous les sous-ensembles en utilisant yE. Ensuite, chacune de ces matrices est transposée avec CM, et tous les sous-ensembles sont pris de leurs lignes, avec yM. La concaténation de ces sous-listes sdonne toutes les sous-matrices transposées possibles. Nous transposons donc A avec CQ, et vérifions s'il est présent avec }.

isaacg
la source
6

Dyalog APL, 53 43 octets

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

B←⎕, A←⎕demander pour Bet A
⍴B, ⍴Adimensions de Bet A
répliquer chacun, par exemple 2 3/¨4 5(4 4) (5 5 5)
⍳¨tous les indices dans chacun des systèmes de coordonnées avec ces dimensions
∘.{}/tableau des sous-matrices possibles, où chaque sous-matrice est définie comme le résultat de la fonction anonyme {}appliquée entre une paire de coordonnées et
∧/∊2</¨:si les deux et ( ∧/∊) les deux ( ¨) augmentent ( 2</), alors ...
B[⍺;⍵]retourne la sous-matrice de Bcréé à partir des intersections des lignes et des colonnes
⋄⍬sinon, retourne un vecteur vide (quelque chose auquel A n'est pas identique)
(⊂A)∊⊃vérifie si l'ensemble de A(⊂A) est membre de l' une des sous-matrices ( )


Ancienne solution de 53 octets:

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

{}Une fonction en ligne anonyme, où est l'argument gauche et la forme de l' argument droit
, par exemple 2 3 pour une matrice 2 par 3
(⍴⍺){}¨⍴⍵pour chaque paire de longueurs de dimension correspondantes, appliquez cette fonction anonyme
⍳⍵*2indices du carré de, c'est-à-dire 2 → 1 2 3 4
(⍵/2)⊤convertir en binaire (le nombre de bits est la longueur de la dimension au carré)
{⍵/⍨⍺=+⌿⍵}du tableau binaire, sélectionner les colonnes ( ⍵/⍨) où le nombre de 1s ( +⌿⍵) est égal à la longueur de cette dimension dans la sous-matrice potentielle ( ⍺=)
↓⍉faire table dans la liste des colonnes stockées
v h←sous v(masques erticaux) et h(masques horizontaux)
puis
h/¨⊂⍵appliquez chaque masque horizontal à la matrice d'arguments de droite
v∘.⌿appliquer chaque masque vertical chacune des versions masquées horizontalement de la grande matrice
(⊂⍺)∊vérifier si la matrice d'argument de gauche en est membre

Adam
la source
3

Gelée, 12 10 octets

Merci @Dennis pour -2 octets

ZŒP
ÇÇ€;/i

Presque le même algorithme que @isaacg, sauf que nous transposons la matrice avant de prendre des sous-ensembles.

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.

Essayez-le ici .

lirtosiast
la source
Plus long que Pyth‽ Impostor!
Adám
1
@ Nᴮᶻ Je n'ai pas dit que c'était la solution Jelly la plus courte.
2016
1
Zau début est plus courte que Z}. Vous pouvez enregistrer un octet supplémentaire en créant ZŒPun lien d'assistance.
Dennis
@Dennis Ok, cela correspond à Pyth. Jouez maintenant au golf un octet de plus.
Adám
3

Mathematica, 40 65 octets

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

Explication: Voir l'une des autres réponses - il semble qu'ils aient tous fait la même chose.

feersum
la source
3

Brachylog , 4 octets

⊇z⊇z

Essayez-le en ligne!

Prend la matrice B par la variable d'entrée et la matrice A par la variable de sortie, et sort par succès ou échec. Il s'agit à peu près de la solution Pyth, sauf que l'entrée est plus implicite et qu'il n'y a pas de génération explicite ni de vérification d'appartenance pour les jeux de puissance.

        B
⊇       has a sublist
 z      which transposed
  ⊇     has a sublist
   z    which transposed
        is A.
Chaîne indépendante
la source
1

Haskell, 66 octets

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

Exemple d'utilisation: ( (.((s.t=<<).s)).elem.t ) [[149, 221]] [[177, 149, 44, 221]]-> True.

Une version sans point est

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
la source
0

Python + NumPy, 176 173 octets

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
la source