Це підматриця?


21

Це двомірне узагальнення цього завдання .

Для наших цілей одна матриця (або 2D масив) A вважається підматрицею іншої матриці B , якщо A можна отримати, повністю видаливши з 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 першу і А другий, якщо ваш вибір відповідає. Можна припустити, що елементи матриць позитивні і менше 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
Я припускаю, що це одиночний персонаж у Jelly.
Adám

@ Nᴮᶻ теж не в APL? : P
Rɪᴋᴇʀ

@RikerW Ні , APL має лише ці та це «рішення» з одного символу, в той час як желе продовжують дивувати нас новими одиночними примітиви характеру, в тому числі більшості з крайнього лівого стовпця тут ...
адам

Відповіді:


7

Pyth, 10 байт

}CQsyMCMyE

Тестовий набір

Це досить просто. Спочатку ми розглядаємо B як список рядків і беремо всі підмножини за допомогоюyE . Потім кожна з цих матриць переміщується з CM, і всі підмножини беруться з їх рядків, з yM. Об'єднання цих підсписів sдає всі можливі перенесені підматриці. Отже, ми транспонируем A з CQі перевіряємо, чи він присутній }.


6

Діалог APL, 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) є членом будь-якої з підматриць ( )


Старе 53-байтне рішення:

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

{}Анонімна вбудована функція, де є лівий аргумент і правильна
форма аргументу , наприклад, 2 3 для матриці 2 на 3
(⍴⍺){}¨⍴⍵для кожної пари відповідних розмірів довжини застосуйте ці
⍳⍵*2індекси анонімних функцій квадрата, тобто 2 → 1 2 3 4
(⍵/2)⊤перетворіть у двійкову (кількість біт - розмір-довжина в квадраті)
{⍵/⍨⍺=+⌿⍵}бінарної таблиці, виберіть стовпці ( ⍵/⍨), де число 1s ( +⌿⍵) дорівнює довжині цього розміру в потенційній підматриці ( ⍺=)
↓⍉make таблицю у списку стовпців
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.

Спробуйте тут .


Довше Імпостора Pyth‽!
Adám

1
@ Nᴮᶻ Я не сказав, що це найкоротше рішення Jelly.
ліртосіаст

1
Zна початку коротший, ніж Z}. Ви можете зберегти подальший байт, зробивши ZŒPпосилання-помічник.
Денніс

@Dennis Добре, що відповідає Pyth. Тепер гольф далеко ще один байт.
Адам

3

Математика, 40 65 байт

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

Пояснення: Дивіться одну з інших відповідей - схоже, що всі вони зробили те саме.


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)])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.