이것이 하위 행렬입니까?


21

이것이이 과제 의 2 차원 일반화 입니다 .

우리의 목적을 위해, 하나의 매트릭스 (또는 2 차원 배열) 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]

B 에서 열 2, 3, 5, 6과 행 2, 4를 삭제 하여 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 ).

도전

당신은 그것을 추측했다. 비어 있지 않은 두 정수 행렬 AB가 주어지면 AB 의 하위 행렬 인지 확인하십시오 .

STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받고 STDOUT (또는 가장 가까운 대안), 함수 리턴 값 또는 함수 (out) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다.

입력은 편리한 형식 일 수 있습니다. 행렬은 입력이 사전 처리되지 않는 한 중첩 된 목록, 두 개의 다른 구분 기호를 사용하는 문자열, 행렬의 차원과 함께 플랫 목록 등으로 제공 될 수 있습니다. 당신은 걸릴하도록 선택할 수 있습니다 B 한 당신의 선택은 일치로, 초. 행렬의 요소가 양수이고 256보다 작다고 가정 할 수 있습니다.

출력되어야 truthy 경우 , A는 의 서브 매트릭스이고 B가falsy 그렇지. 특정 출력 값이 일치하지 않아도됩니다.

표준 규칙이 적용됩니다.

테스트 사례

각 테스트 사례는 별도의 줄에 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
나는 이것이 젤리에서 단일 문자라고 생각합니다.
Adám

@ Nᴮᶻ도 APL에 없습니까? : P
Rɪᴋᴇʀ

@RikerW 아니오 , APL 만이 이들이들 젤리가 가장 왼쪽 컬럼의 대부분을 포함, 새로운 하나의 문자 프리미티브으로 우리를 놀라게 유지하면서, 하나의 문자 "솔루션" 여기 ...
아담

답변:


7

Pyth, 10 바이트

}CQsyMCMyE

테스트 스위트

이것은 매우 간단합니다. 먼저 B를 행 목록으로 간주하고를 사용하여 모든 하위 집합을 가져옵니다 yE. 그런 다음 각 행렬을로 바꾸고 CM모든 부분 집합을로 행에서 가져옵니다 yM. 이 s서브 리스트를 연결하면 가능한 모든 전치 서브 매트릭스 가 제공됩니다. 따라서 A를로 바꾸고 CQ그것이 있는지 확인하십시오 }.


6

Dyalog APL, 53 43 바이트

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

B←⎕, A←⎕위한 프롬프트 BA
⍴B, ⍴A치수 BA
각 복제 예 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(ertical 마스크) 및 h(수평 마스크)
다음
h/¨⊂⍵오른쪽 인자 행렬 각각 수평 마스크를 적용
v∘.⌿
(⊂⍺)∊왼쪽 인수 행렬이 구성원인지 여부를 확인하기 위해 큰 행렬의 가로로 마스크 된 버전 중 하나를 각각의 수직 마스크에 적용


3

젤리, 12 10 바이트

-2 바이트에 대한 @Dennis 감사합니다

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ᴮᶻ 나는 이것이 가장 짧은 젤리 솔루션이라고 말하지 않았다.
lirtosiast

1
Z처음에는보다 짧습니다 Z}. ZŒP도우미 링크 를 만들어 추가 바이트를 절약 할 수 있습니다 .
Dennis

@Dennis Ok, Pyth와 일치합니다. 이제 1 바이트 더 멀리 골프를 치십시오.
Adám

3

Mathematica, 40 65 바이트

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

설명 : 다른 답변 중 하나를보십시오. 모두 같은 일을 한 것처럼 보입니다.


3

Brachylog , 4 바이트

⊇z⊇z

온라인으로 사용해보십시오!

입력 변수를 통해 행렬 B를, 출력 변수를 통해 행렬 A를 취하여 성공 또는 실패를 통해 출력합니다. 이것은 입력이 더 내재적이며 전원 세트에 대한 명시 적 생성 또는 멤버쉽 검사가 없다는 점을 제외하면 Pyth 솔루션과 거의 같습니다.

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

1

하스켈, 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

파이썬 + 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)])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.