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 code-golf 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]]
la source
Réponses:
Pyth, 10 octets
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 avecCM
, et tous les sous-ensembles sont pris de leurs lignes, avecyM
. La concaténation de ces sous-listess
donne toutes les sous-matrices transposées possibles. Nous transposons donc A avecCQ
, et vérifions s'il est présent avec}
.la source
Dyalog APL,
5343 octetsB←⎕
,A←⎕
demander pourB
etA
⍴B
,⍴A
dimensions deB
etA
/¨
répliquer chacun, par exemple2 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 deB
créé à 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 deA
(⊂A
) est membre de l'∊
une des sous-matrices (⊃
)Ancienne solution de 53 octets:
{
…}
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⍳⍵*2
indices 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éesv h←
sousv
(masques erticaux) eth
(masques horizontaux)⊣
puish/¨⊂⍵
appliquez chaque masque horizontal à la matrice d'arguments de droitev∘.⌿
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 membrela source
Gelée,
1210 octetsMerci @Dennis pour -2 octets
Presque le même algorithme que @isaacg, sauf que nous transposons la matrice avant de prendre des sous-ensembles.
Essayez-le ici .
la source
Z
au début est plus courte queZ}
. Vous pouvez enregistrer un octet supplémentaire en créantZŒP
un lien d'assistance.Mathematica, 40
65octetsExplication: Voir l'une des autres réponses - il semble qu'ils aient tous fait la même chose.
la source
Brachylog , 4 octets
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.
la source
Haskell, 66 octets
Exemple d'utilisation:
( (.((s.t=<<).s)).elem.t ) [[149, 221]] [[177, 149, 44, 221]]
->True
.Une version sans point est
la source
Python + NumPy,
176173 octetsla source