Jest to dwuwymiarowe uogólnienie tego wyzwania .
Do naszych celów, jeden matrycę (lub panelu 2D) jest uważany za podmatryca innego macierzy B , jeśli może być uzyskany przez całkowite usunięcie liczbę wierszy i kolumn z B . (Uwaga: niektóre źródła mają różne / bardziej restrykcyjne definicje).
Oto przykład:
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]
Możemy usunąć kolumny 2, 3, 5, 6 i wiersze 2, 4 z B, aby uzyskać 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] _ _ _ _ _ _]
Zauważ, że A jest nadal submatrixem B, jeśli wszystkie wiersze lub wszystkie kolumny B są zachowane (lub w rzeczywistości, jeśli A = B ).
Wyzwanie
Zgadłeś. Biorąc pod uwagę dwa niepusty całkowitą macierzy i B należy określić, czy jest podmatryca z B .
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Dane wejściowe mogą być w dowolnym dogodnym formacie. Macierze można podawać jako listy zagnieżdżone, ciągi znaków z dwoma różnymi separatorami, listy płaskie wraz z wymiarami macierzy itp., O ile dane wejściowe nie są wstępnie przetworzone. Możesz zdecydować się wziąć B najpierw, a A drugi, o ile twój wybór jest zgodny. Możesz założyć, że elementy macierzy są dodatnie i mniejsze niż 256.
Wyjście powinno być zgodne z prawdą, jeśli A jest submatrixem B, a fałsz w przeciwnym razie. Określona wartość wyjściowa nie musi być spójna.
Obowiązują standardowe zasady gry w golfa .
Przypadki testowe
Każdy przypadek testowy jest na osobnej linii A, B
.
Prawdziwe przypadki:
[[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]]
Przypadki Falsy:
[[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]]
źródło
Odpowiedzi:
Pyth, 10 bajtów
Zestaw testowy
Jest to dość proste. Po pierwsze, bierzemy pod uwagę B jako listę wierszy i używamy wszystkich podzbiorów
yE
. Następnie każda z tych macierzy jest transponowanaCM
i wszystkie podzbiory są pobierane z ich wierszy, za pomocąyM
. Łącząc te podlisty zs
wszystkimi możliwymi transponowanymi podstronami. Więc transponujemy A za pomocąCQ
i sprawdzamy, czy jest obecny z}
.źródło
Dyalog APL,
5343 bajtyB←⎕
,A←⎕
Zachęty doB
iA
⍴B
,⍴A
wymiaryB
iA
/¨
replikacji każda, np2 3/¨4 5
→(4 4) (5 5 5)
⍳¨
wszystkie współczynniki w każdym z układów współrzędnych z tych wymiarów∘.{
...}/
Tabela możliwych podmatryc, gdzie każdy podmatryca jest zdefiniowane jako wynik funkcji anonimowego{
...}
stosowanych pomiędzy parą współrzędnych⍺
i⍵
∧/∊2</¨:
jeśli oba⍺
i⍵
są (∧/∊
) oba (¨
) zwiększające się (2</
), to ...B[⍺;⍵]
zwróć podtekstyB
utworzonych ze skrzyżowań wierszy⍺
i kolumn⍵
⋄⍬
, zwróć pusty wektor (coś, co A nie jest identyczne)(⊂A)∊⊃
sprawdź, czy całośćA
(⊂A
) jest członkiem∊
któregokolwiek z submatrices (⊃
)Stare 53-bajtowe rozwiązanie:
{
…}
Anonimowa funkcja wstawiana, w której⍺
argument lewy i kształt⍵
argumentu prawego⍴
, np. 2 3 dla macierzy 2 na 3(⍴⍺){
…}¨⍴⍵
dla każdej pary odpowiadających długości wymiarów, zastosuj te anonimowe⍳⍵*2
wskaźniki funkcji kwadratu, tj. 2 → 1 2 3 4(⍵/2)⊤
konwersji binarny (liczba bitów znajduje się wymiar długości kwadratu){⍵/⍨⍺=+⌿⍵}
stołu binarnej wyboru kolumny (⍵/⍨
), w których liczba wartości 1 (+⌿⍵
) jest równa długości tego wymiaru potencjalnej podmatryca (⍺=
)↓⍉
make tabelę do listy kolumnv h←
przechowuj jakov
(maski pionowe) ih
(maski poziome),⊣
a następnieh/¨⊂⍵
zastosuj każdą maskę poziomą do prawej macierzy argumentówv∘.⌿
zastosuj każdą maskę pionową każdą z poziomo zamaskowanych wersji dużej macierzy,(⊂⍺)∊
sprawdź, czy jej lewą macierz argumentów jest jej członkiemźródło
Galaretka,
1210 bajtówDzięki @Dennis za -2 bajty
Prawie taki sam algorytm jak @isaacg, z tym wyjątkiem, że transponujemy macierz przed pobraniem podzbiorów.
Wypróbuj tutaj .
źródło
Z
na początku jest krótszy niżZ}
. Możesz zapisać kolejny bajt, tworzącZŒP
link pomocnika.Mathematica, 40
65bajtówObjaśnienie: Zobacz jedną z pozostałych odpowiedzi - wygląda na to, że wszyscy zrobili to samo.
źródło
Brachylog , 4 bajty
Wypróbuj online!
Przeciąga macierz B przez zmienną wejściową, a macierz A przez zmienną wyjściową, i wyprowadza przez sukces lub porażkę. Jest to w zasadzie tylko rozwiązanie Pyth, z wyjątkiem tego, że dane wejściowe są bardziej niejawne i nie ma jawnego generowania ani sprawdzania członkostwa dla zestawów zasilania.
źródło
Haskell, 66 bajtów
Przykład użycia:
( (.((s.t=<<).s)).elem.t ) [[149, 221]] [[177, 149, 44, 221]]
->True
.Wersja nie-punktowa to
źródło
Python + NumPy,
176173 bajtówźródło