Đây có phải là một Subatrix?


21

Đây là khái quát 2 chiều của thách thức này .

Đối với mục đích của chúng tôi, một ma trận (hoặc mảng 2D) Một được coi là một submatrix của một ma trận B , nếu A có thể thu được bằng cách loại bỏ hoàn toàn một số hàng và cột từ B . (Lưu ý: một số nguồn có định nghĩa khác / hạn chế hơn.)

Đây là một ví dụ:

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]

Chúng ta có thể xóa các cột 2, 3, 5, 6 và hàng 2, 4 từ B để lấy 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]         _ _ _ _ _ _]

Lưu ý rằng A vẫn là một hàm con của B nếu tất cả các hàng hoặc tất cả các cột của B được giữ lại (hoặc trên thực tế nếu A = B ).

Các thách thức

Bạn đoán nó Với số nguyên hai không trống ma trận AB , xác định xem A là một submatrix của B .

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).

Đầu vào có thể ở bất kỳ định dạng thuận tiện. Các ma trận có thể được đưa ra dưới dạng danh sách lồng nhau, chuỗi sử dụng hai dấu phân cách khác nhau, danh sách phẳng cùng với kích thước của ma trận, v.v, miễn là đầu vào không được xử lý trước. Bạn có thể chọn lấy B trước và A thứ hai, miễn là lựa chọn của bạn phù hợp. Bạn có thể giả sử rằng các yếu tố của ma trận là dương và nhỏ hơn 256.

Output nên truthy nếu A là một submatrix của Bfalsy khác. Giá trị đầu ra cụ thể không nhất quán.

Luật tiêu chuẩn được áp dụng.

Các trường hợp thử nghiệm

Mỗi trường hợp thử nghiệm là trên một dòng riêng biệt A, B,.

Trường hợp thật:

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

Trường hợp giả

[[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
Tôi cho rằng đây là một nhân vật duy nhất trong Jelly.
Adám

@ Nᴮᶻ không ở APL quá? : P
Rɪᴋᴇʀ 10/03/2016

@RikerW Không , APL chỉ có nhữngnhững ký tự đơn "giải pháp", trong khi Jelly giữ ngạc nhiên cho chúng ta mới nguyên thủy nhân vật duy nhất, bao gồm hầu hết các cột tận cùng bên trái ở đây ...
Adam

Câu trả lời:


7

Bình thường, 10 byte

}CQsyMCMyE

Bộ kiểm tra

Điều này khá đơn giản. Đầu tiên, chúng tôi coi B là một danh sách các hàng và lấy tất cả các tập hợp con bằng cách sử dụng yE. Sau đó, mỗi ma trận được hoán vị CMvà tất cả các tập hợp con được lấy từ các hàng của chúng, với yM. Kết hợp các danh sách con này với việc sđưa ra tất cả các mô hình con được chuyển đổi có thể. Vì vậy, chúng tôi hoán chuyển A với CQvà kiểm tra xem nó có hiện diện với }.


6

APL Dyalog, 53 43 byte

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

B←⎕, A←⎕nhắc nhở choBA
⍴B, ⍴Akích thước của BA
tái tạo mỗi, ví dụ 2 3/¨4 5(4 4) (5 5 5)
⍳¨tất cả các chỉ số trong mỗi hệ thống phối hợp với những kích thước
∘.{... }/bảng submatrices có thể, trong đó mỗi submatrix được định nghĩa như là kết quả của hàm nặc danh {... }áp dụng giữa một cặp tọa độ
∧/∊2</¨:nếu cả hai là ( ∧/∊) cả hai ( ¨) tăng ( 2</), thì ...
B[⍺;⍵]trả về hàm con Bđược tạo từ các giao điểm của các hàng và cột
⋄⍬khác, trả về một vectơ trống (thứ mà A không giống hệt)
(⊂A)∊⊃kiểm tra xem toàn bộ A(⊂A) là thành viên của bất kỳ mô hình con nào ( )


Giải pháp cũ 53 byte:

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

{... }một hàm nội tuyến ẩn danh, nơi là lập luận trái và là đúng lý lẽ
hình dạng, ví dụ như 2 3 cho 2-by-3 matrix
(⍴⍺){... }¨⍴⍵cho mỗi cặp tương ứng chiều-dài, áp dụng điều này mang tính chất chức năng
⍳⍵*2chỉ số của bình phương của, tức là 2 → 1 2 3 4
(⍵/2)⊤chuyển đổi thành nhị phân (số bit là bình phương chiều dài chiều)
{⍵/⍨⍺=+⌿⍵}của bảng nhị phân, chọn các cột ( ⍵/⍨) trong đó số 1s ( +⌿⍵) bằng với độ dài của kích thước đó trong hàm con tiềm năng ( ⍺=)
↓⍉tạo ra bảng vào danh sách các cột
v h←lưu trữ dưới dạng v(mặt nạ dọc) và h(mặt nạ ngang)
sau đó
h/¨⊂⍵áp dụng từng mặt nạ ngang cho ma trận đối số bên phải
v∘.⌿áp dụng mỗi mặt nạ dọc mỗi một trong các phiên bản mặt nạ theo chiều ngang của
(⊂⍺)∊kiểm tra ma trận lớn nếu ma trận đối số bên trái là thành viên của nó


3

Thạch, 12 10 byte

Cảm ơn @Dennis cho -2 byte

ZŒP
ÇÇ€;/i

Gần như cùng một thuật toán với @isaacg, ngoại trừ chúng ta hoán vị ma trận trước khi lấy các tập con.

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.

Hãy thử nó ở đây .


Dài hơn Pyth‽ Kẻ mạo danh!
Adám

1
@ Nᴮᶻ Tôi không nói đây là giải pháp Jelly ngắn nhất.
lirtosiast

1
Zlúc bắt đầu ngắn hơn Z}. Bạn có thể lưu thêm một byte bằng cách tạo ZŒPliên kết trợ giúp.
Dennis

@Dennis Ok, phù hợp với Pyth. Bây giờ chơi golf thêm một byte.
Adám

3

Toán học, 40 65 byte

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

Giải thích: Xem một trong những câu trả lời khác - có vẻ như tất cả họ đều làm điều tương tự.


3

Brachylog , 4 byte

⊇z⊇z

Hãy thử trực tuyến!

Đưa ma trận B qua biến đầu vào và ma trận A qua biến đầu ra và xuất ra thông qua thành công hay thất bại. Đây không chỉ là giải pháp Pyth, ngoại trừ đầu vào ẩn hơn và không có kiểm tra thành viên hoặc thế hệ rõ ràng nào cho các bộ điều khiển.

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

1

Haskell, 66 byte

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

Ví dụ sử dụng: ( (.((s.t=<<).s)).elem.t ) [[149, 221]] [[177, 149, 44, 221]]-> True.

Một phiên bản không có điểm là

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 byte

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)])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.