นี่เป็นแบบย่อยหรือไม่?


21

นี่เป็นลักษณะทั่วไปแบบสองมิติของความท้าทายนี้

สำหรับวัตถุประสงค์ของเราหนึ่งเมทริกซ์ (หรือ 2D อาร์เรย์) ถือว่าเป็นsubmatrixอีกเมทริกซ์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ยังคงเป็น submatrix ของBหากแถวทั้งหมดหรือคอลัมน์ทั้งหมดของBถูกเก็บไว้ (หรือในความเป็นจริงถ้าA = B )

ความท้าทาย

คุณเดามัน รับเมทริกซ์AและBจำนวนเต็มที่ไม่ว่างสองค่าให้หาว่าAเป็นเมทริกซ์ย่อยของBหรือไม่

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

อินพุตอาจอยู่ในรูปแบบที่สะดวก เมทริกซ์สามารถถูกกำหนดให้เป็นรายการแบบซ้อน, สตริงที่ใช้ตัวคั่นสองตัวที่แตกต่างกัน, รายการแบบแฟลตพร้อมด้วยขนาดของเมทริกซ์, ฯลฯ ตราบใดที่อินพุตไม่ได้ถูกประมวลผลล่วงหน้า คุณอาจเลือกที่จะใช้Bครั้งแรกและสองตราบใดที่คุณเลือกมีความสอดคล้อง คุณอาจคิดว่าองค์ประกอบของเมทริกซ์นั้นเป็นบวกและน้อยกว่า 256

เอาท์พุทควรเป็นจริงถ้าAเป็น submatrix ของ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
ฉันคิดว่านี่เป็นตัวละครเดียวในเจลลี่
2559

@ 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←⎕พร้อมท์BและA
⍴B, ⍴AขนาดของBและA
ทำซ้ำแต่ละ, เช่น2 3/¨4 5(4 4) (5 5 5)
⍳¨ดัชนีทั้งหมดในแต่ละระบบพิกัดด้วยมิติเหล่านั้น
∘.{}/ตารางของเมทริกซ์ย่อยที่เป็นไปได้, ซึ่งแต่ละเมทริกซ์ย่อยถูกกำหนดเป็นผลลัพธ์ของฟังก์ชันนิรนาม{... }ใช้ระหว่างคู่ของพิกัดและ
∧/∊2</¨:หากทั้งสองและเป็น ( ∧/∊) ทั้งสอง ( ¨) เพิ่มขึ้น ( 2</) แล้ว ...
B[⍺;⍵]กลับ submatrix ของการBสร้างจากจุดตัดของแถว) เป็นสมาชิกของและคอลัมน์
⋄⍬อื่นให้ส่งคืนเวกเตอร์เปล่า (สิ่งที่ A ไม่เหมือนกัน)
(⊂A)∊⊃ตรวจสอบว่าทั้งหมดของA(⊂A submatrices ใด ๆ ( )


โซลูชัน 53 ไบต์แบบเก่า:

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

{... }ฟังก์ชั่นแบบอินไลน์ที่ไม่ระบุชื่อที่เป็นข้อโต้แย้งด้านซ้ายและการโต้แย้งสิทธิ
รูปร่างเช่น 2 3 เมทริกซ์ 2 โดย 3
(⍴⍺){... }¨⍴⍵สำหรับคู่ของที่สอดคล้องมิติความยาวแต่ละใช้นี้ที่ไม่ระบุชื่อฟังก์ชั่น
⍳⍵*2ดัชนีของตารางคือ 2 → 1 2 3 4
(⍵/2)⊤แปลงเลขฐานสอง (จำนวนบิตเป็นมิติความยาวยกกำลังสอง)
{⍵/⍨⍺=+⌿⍵}ของตารางไบนารีเลือกคอลัมน์ ( ⍵/⍨) ซึ่งมีจำนวน 1s (คน+⌿⍵) มีค่าเท่ากับความยาวของมิติที่อยู่ใน submatrix ศักยภาพ ( ⍺=)
↓⍉แต่งหน้า ตารางลงในรายการคอลัมน์ที่
v h←จัดเก็บเป็นv(มาสก์ ertical) และ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‽ Impostor!
2559

1
@ Nᴮᶻฉันไม่ได้บอกว่านี่เป็นวิธีการแก้ปัญหาเยลลี่ที่สั้นที่สุด
lirtosiast

1
ZZ}ที่จุดเริ่มต้นจะสั้นกว่า คุณสามารถบันทึกไบต์เพิ่มเติมได้โดยสร้างZŒPลิงก์ผู้ช่วยเหลือ
Dennis

@Dennis Ok, ตรงกับ Pyth ตอนนี้ตีกอล์ฟออกไปอีกหนึ่งไบต์
2559

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

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)])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.