Это подматрица?

21

Это двумерное обобщение этой задачи .

Для наших целей, одна матрицы (или 2D массив) считаются подматрица другой матрицы B , если может быть получена путем полного удаления ряда строк и столбцов из B . (Примечание: некоторые источники имеют разные / более ограничительные определения.)

Вот пример:

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]

Мы можем удалить столбцы 2, 3, 5, 6 и строки 2, 4 из B, чтобы получить 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]         _ _ _ _ _ _]

Обратите внимание, что A все еще является подматрицей B, если все строки или все столбцы B сохраняются (или фактически, если A = B ).

Соревнование

Ты угадал. Принимая во внимание два непустых целочисленных матриц и Б , определить , является ли является подматрица B .

Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).

Ввод может быть в любом удобном формате. Матрицы могут быть заданы как вложенные списки, строки с использованием двух разных разделителей, плоские списки вместе с размерами матрицы и т. Д., Если входные данные не предварительно обработаны. Вы можете взять B первым и A вторым, если ваш выбор не изменился. Можно предположить, что элементы матриц положительны и меньше 256.

Вывод должен быть правдивым, если A является подматрицей B, и ложным в противном случае. Конкретное выходное значение не обязательно должно быть согласованным.

Применяются стандартные правила .

Тестовые случаи

Каждый тестовый пример находится на отдельной строке A, B.

Правдивые случаи:

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

Ложные случаи:

[[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
Я полагаю, это единственный персонаж в желе.
Адам
@ Не в APL тоже? : P
Rɪᴋᴇʀ
@RikerW Нет , у APL есть только эти и эти односимвольные «решения», в то время как Jelly продолжает удивлять нас новыми односимвольными примитивами, включая большую часть левого столбца здесь ...
Adám

Ответы:

7

Pyth, 10 байт

}CQsyMCMyE

Тестирование

Это довольно просто. Сначала мы рассматриваем B как список строк и используем все подмножества yE. Затем каждая из этих матриц транспонируется с CM, а все подмножества берутся из их строк с yM. Конкатенация этих подсписков с sдает все возможные транспонированные подматрицы. Таким образом, мы переносим A с помощью CQи проверяем, присутствует ли он с }.

isaacg
источник
6

Дьялог АПЛ, 53 43 байта

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

B←⎕, A←⎕запрашивать Bи A
⍴B, ⍴Aразмеры Bи A
реплицировать каждый, например, 2 3/¨4 5(4 4) (5 5 5)
⍳¨все индексы в каждой из систем координат с этими измерениями
∘.{}/таблица возможных подматриц, где каждая подматрица определяется как результат анонимной функции {…, }примененной между парой координат и
∧/∊2</¨:если оба и являются ( ∧/∊) оба ( ¨) Увеличивается ( 2</), то ...
B[⍺;⍵]вернуть подматрицу Bсозданного из пересечений строк и столбцов в
⋄⍬противном случае, вернуть пустой вектор (то, что A не является идентичным)
(⊂A)∊⊃проверить, если все A(⊂A) является членом любой из подматриц ( )


Старое 53-байтовое решение:

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

{}Анонимная встроенная функция, где левый аргумент и форма правого аргумента
, например, 2 3 для матрицы 2 на 3
(⍴⍺){}¨⍴⍵для каждой пары соответствующих длин измерений, применяют
⍳⍵*2индексы этой анонимной функции квадрата, то есть 2 → 1 2 3 4
(⍵/2)⊤преобразовать в двоичный (число битов измерения длины в квадрате)
{⍵/⍨⍺=+⌿⍵}бинарной таблицы, выберите столбцы ( ⍵/⍨) , где число 1s ( +⌿⍵) равно длине этого измерения в потенциальном подматрицы ( ⍺=)
↓⍉сделайте таблица в список столбцов
v h←сохраните как v(маски вертикальные) и h(маски горизонтальные),
затем
h/¨⊂⍵примените каждую горизонтальную маску к правильной матрице аргументов
v∘.⌿применять каждую вертикальную маску к каждой из версий маски большой горизонтальной маски,
(⊂⍺)∊проверять, является ли левая матрица аргументов ее членом

Адам
источник
3

Желе, 12 10 байт

Спасибо @Dennis за -2 байта

ZŒP
ÇÇ€;/i

Почти тот же алгоритм, что и @isaacg, за исключением того, что мы транспонируем матрицу перед тем, как брать подмножества.

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.

Попробуй это здесь .

lirtosiast
источник
Дольше, чем самозванец Pyth‽!
Адам
1
@ Nᴮᶻ Я не говорил, что это было самое короткое решение для желе.
lirtosiast
1
Zв начале короче чем Z}. Вы можете сохранить еще один байт, сделав ZŒPвспомогательную ссылку.
Деннис
@ Денис Хорошо, это соответствует Питу. Теперь в гольфе прочь еще один байт.
Адам
3

Mathematica, 40 65 байт

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

Пояснение: посмотрите один из других ответов - похоже, они все сделали одно и то же.

feersum
источник
3

Брахилог , 4 байта

⊇z⊇z

Попробуйте онлайн!

Принимает матрицу B через входную переменную и матрицу A через выходную переменную и выводит данные в случае успеха или неудачи. Это в значительной степени просто решение Pyth, за исключением того, что ввод более неявный и нет явной генерации или проверки принадлежности для наборов мощности.

        B
⊇       has a sublist
 z      which transposed
  ⊇     has a sublist
   z    which transposed
        is A.
Несвязанная строка
источник
1

Haskell, 66 байт

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

Пример использования: ( (.((s.t=<<).s)).elem.t ) [[149, 221]] [[177, 149, 44, 221]]-> True.

Неточечная версия

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 байта

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)])
Карл Напф
источник