Bu bir alt matris mi?


21

Bu, bu zorluğun 2 boyutlu genellemesidir .

Buradaki amaçlar için, bir matris (ya da 2 boyutlu dizi) bir bir kabul edilir submatrix bir matris B ise, bir tamamen satır ve sütun bir dizi çıkarılması ile elde edilebilir B . (Not: bazı kaynakların farklı / daha kısıtlayıcı tanımları vardır.)

İşte bir örnek:

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]

A elde etmek için 2, 3, 5, 6 sütunlarını ve 2, 4 satırlarını B'den silebiliriz :

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

Bu Not A bir submatrix hala B tüm satırları veya her sütun halinde B muhafaza (ya da, aslında, eğer A = B ).

Meydan okuma

Tahmin ettin. Verilen iki boş olmayan bir tamsayıdır matrisler bir ve B olmadığını belirlemek için bir bir submatrix olan B .

STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı yoluyla giriş alarak ve sonucu STDOUT (veya en yakın alternatif), fonksiyon dönüş değeri veya function (out) parametresi ile çıktı alarak bir program veya işlev yazabilirsiniz.

Giriş herhangi bir uygun biçimde olabilir. Matrisler yuvalanmış listeler, iki farklı ayırıcı kullanan dizeler, matrisin boyutları ile birlikte düz listeler vb. Giriş önceden işlenmediği sürece verilebilir. Seçiminiz tutarlı olduğu sürece B ve A saniye seçmeyi seçebilirsiniz . Matrislerin elementlerinin pozitif ve 256'dan küçük olduğunu varsayabilirsiniz.

Çıktı olmalıdır truthy eğer bir bir submatrix olan B ve falsy aksi. Özel çıktı değerinin tutarlı olması gerekmez.

Standart kuralları geçerlidir.

Test Kılıfları

Her test durumu ayrı bir satırda A, B.

Gerçek vakalar:

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

Sahte davalar:

[[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
Sanırım bu Jelly'de tek bir karakter.
Adám

@ Nᴮᶻ APL’de de değil mi? : P
Rɪᴋᴇʀ

@RikerW Hayır , APL sadece sahiptir bu ve bunlar Jelly en soldaki sütunun en içeren yeni tek bir karakter ilkel bize şaşırtmaya devam ederken, tek bir karakter "çözümler" Burada ...
Adam

Yanıtlar:


7

Pyth, 10 bayt

}CQsyMCMyE

Test odası

Bu oldukça basittir. Öncelikle, B'yi bir satır listesi olarak görüyor ve tüm alt kümeleri kullanarak alıyoruz yE. Daha sonra, bu matrislerin her biri ile çevrilir CMve tüm alt kümeleri ile birlikte satırlarından alınır yM. Bu alt listeleri bir araya getirmek s, olası tüm aktarılmış alt kayıtları verir. Bu yüzden A'yı birlikte transpoze ediyoruz CQve mevcut olup olmadığını kontrol ediyoruz }.


6

Dyalog APL, 53 43 bayt

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

B←⎕, A←⎕İstemi Bve A
⍴B, ⍴Aboyutları Bve A
her bir deneyden, örneğin 2 3/¨4 5(4 4) (5 5 5)
⍳¨bu boyutlara sahip koordinat sistemlerinin her tüm dizinler
∘.{... }/Her submatrix anonim fonksiyonunun sonucu olarak tanımlanır mümkün submatrices, tablo {... }bir koordinat çifti arasında uygulanır ve
∧/∊2</¨:her ikisi de ve (( ∧/∊her ikisi de) ( ¨) artan ( 2</), öyleyse ... ... satır ve sütunların kesişimlerinden oluşturulan alt
B[⍺;⍵]matrisini döndür, boş bir vektör döndür ( A ile aynı olmayan bir şey) tümünün (B
⋄⍬
(⊂A)∊⊃A⊂A)alt matematiğin herhangi biri ( )


Eski 53 baytlık çözüm:

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

{… Sol argüman olan ve sağ argüman şekli }olan anonim bir satır içi işlev, örn. 2'ye 3'lük bir matris için 2 3 … karşılık gelen boyut uzunluklarının her çifti için , karenin bu anonim işlev indekslerini uygulayın , yani 2 → 1 2 3 4 ikili dönüştürmek (bitlerin sayısı kare boyutu uzunluklu) sütun (seçin ikili tablonun (1S sayısı) () potansiyel submatrix bu boyutunun uzunluğu eşittir ) marka sütunların listesine tablo olarak saklamak (ertical maskeleri) ve (yatay maskeler) sonra sağ argüman matrisine her yatay maske uygulamak

(⍴⍺){}¨⍴⍵
⍳⍵*2
(⍵/2)⊤
{⍵/⍨⍺=+⌿⍵}⍵/⍨+⌿⍵⍺=
↓⍉
v h←vh

h/¨⊂⍵
v∘.⌿Her bir dikey maskeyi
(⊂⍺)∊, sol argüman matrisinin üyesi olup olmadığını kontrol etmek için büyük matrisin yatay olarak maskelenmiş versiyonlarının her birini uygulayın.


3

Jöle, 12 10 bayt

-2 bayt için @Dennis teşekkürler

ZŒP
ÇÇ€;/i

Neredeyse @ isaacg ile aynı algoritma hariç, altkümeleri almadan önce matrisi çeviriyoruz.

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.

Burada dene .


Pyth‽ Impostor'dan daha uzun!
Adám

1
@ Nᴮᶻ Bunun en kısa Jelly çözümü olduğunu söylemedim.
lirtosiast

1
Zbaşlangıçta daha kısa Z}. ZŒPYardımcı bir bağlantı yaparak başka bir bayttan tasarruf edebilirsiniz .
Dennis,

@Dennis Tamam, Pyth ile aynı. Şimdi bir bayt daha uzak golf.
Adám

3

Mathematica, 40 65 bayt

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

Açıklama: Diğer cevaplardan birine bakınız - hepsi aynı şeyi yapmış gibi görünüyor.


3

Brachylog , 4 bayt

⊇z⊇z

Çevrimiçi deneyin!

B matrisini giriş değişkeni ile A matrisini çıkış değişkeni üzerinden alır ve çıktı veya başarısızlık yoluyla verir. Bu sadece Pyth çözümü, girdi daha örtük olması ve güç tesislerini kontrol etmek için açık bir üretim veya üyelik bulunmaması dışında.

        B
⊇       has a sublist
 z      which transposed
  ⊇     has a sublist
   z    which transposed
        is A.

1

Haskell, 66 bayt

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

Kullanım örneği: ( (.((s.t=<<).s)).elem.t ) [[149, 221]] [[177, 149, 44, 221]]-> True.

Noktasız sürüm

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

Python + NumPy, 176 173 bayt

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)])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.