Это двумерное обобщение этой задачи .
Для наших целей, одна матрицы (или 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]]
источник
Ответы:
Pyth, 10 байт
Тестирование
Это довольно просто. Сначала мы рассматриваем B как список строк и используем все подмножества
yE
. Затем каждая из этих матриц транспонируется сCM
, а все подмножества берутся из их строк сyM
. Конкатенация этих подсписков сs
дает все возможные транспонированные подматрицы. Таким образом, мы переносим A с помощьюCQ
и проверяем, присутствует ли он с}
.источник
Дьялог АПЛ,
5343 байта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-байтовое решение:
{
…}
Анонимная встроенная функция, где⍺
левый аргумент и форма⍵
правого аргумента⍴
, например, 2 3 для матрицы 2 на 3(⍴⍺){
…}¨⍴⍵
для каждой пары соответствующих длин измерений, применяют⍳⍵*2
индексы этой анонимной функции квадрата, то есть 2 → 1 2 3 4(⍵/2)⊤
преобразовать в двоичный (число битов измерения длины в квадрате){⍵/⍨⍺=+⌿⍵}
бинарной таблицы, выберите столбцы (⍵/⍨
) , где число 1s (+⌿⍵
) равно длине этого измерения в потенциальном подматрицы (⍺=
)↓⍉
сделайте таблица в список столбцовv h←
сохраните какv
(маски вертикальные) иh
(маски горизонтальные),⊣
затемh/¨⊂⍵
примените каждую горизонтальную маску к правильной матрице аргументовv∘.⌿
применять каждую вертикальную маску к каждой из версий маски большой горизонтальной маски,(⊂⍺)∊
проверять, является ли левая матрица аргументов ее членомисточник
Желе,
1210 байтСпасибо @Dennis за -2 байта
Почти тот же алгоритм, что и @isaacg, за исключением того, что мы транспонируем матрицу перед тем, как брать подмножества.
Попробуй это здесь .
источник
Z
в начале короче чемZ}
. Вы можете сохранить еще один байт, сделавZŒP
вспомогательную ссылку.Mathematica, 40
65байтПояснение: посмотрите один из других ответов - похоже, они все сделали одно и то же.
источник
Брахилог , 4 байта
Попробуйте онлайн!
Принимает матрицу B через входную переменную и матрицу A через выходную переменную и выводит данные в случае успеха или неудачи. Это в значительной степени просто решение Pyth, за исключением того, что ввод более неявный и нет явной генерации или проверки принадлежности для наборов мощности.
источник
Haskell, 66 байт
Пример использования:
( (.((s.t=<<).s)).elem.t ) [[149, 221]] [[177, 149, 44, 221]]
->True
.Неточечная версия
источник
Python + NumPy,
176173 байтаисточник