สี่เหลี่ยมเหล่านี้ทับซ้อนกันหรือไม่?


11

กำหนดพิกัดของมุมซ้ายบนของสองสี่เหลี่ยมและความยาวด้านของพวกเขาตรวจสอบว่าสี่เหลี่ยมที่ทับซ้อนกัน รูปสี่เหลี่ยมประกอบด้วยเส้นด้านบนและด้านซ้าย แต่ไม่ใช่เส้นด้านล่างและด้านขวา นั่นคือจุดที่(a,b)อยู่ในตารางที่มีความยาวด้านkที่เริ่มต้นที่(x,y)ถ้าหากว่าและx <= a < x+k y <= b < y+kสี่เหลี่ยมจัตุรัสที่มีความยาวด้าน 0 เป็นค่าเสื่อมและจะไม่ถูกพิจารณาที่นี่ดังนั้นkจะเป็นค่าบวก

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

กรณีทดสอบ

x1 y1 k1  x2 y2 k2  overlap?
 1  1  1   0  1  1  false
 0  0  3   1  1  1  true
 1  1  1   0  0  3  true
 0  0  3   2  1  2  true
 0  0  2   1  1  2  true
 1  1  2   0  0  2  true
 0  1  2   1  0  2  true
 1  0  2   0  1  2  true
 2  0  2   0  2  2  false
 1  0  3   0  1  1  false
 0  2  3   0  0  2  false

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


คำตอบ:


22

Python ขนาด 33 ไบต์

lambda x,y,k,X,Y,K:k>X-x>-K<Y-y<k

Python สนับสนุนกลุ่มของความไม่เท่าเทียมกันแม้ว่าพวกเขาจะชี้ทิศทางตรงกันข้าม

ช่วงเวลาพิกัด x [x,x+k)และการ[X,X+K)ทับซ้อนตราบใดที่ไม่มีค่าใดอยู่ทางขวาของอีกค่าซึ่งหมายความว่าจุดสิ้นสุดด้านซ้ายของแต่ละช่วงนั้นเหลือจากจุดสิ้นสุดด้านขวาของช่วงเวลาอื่น

x<X+K
X<x+k

-K<X-x<kที่สามารถนำมารวมกันเป็นความไม่เท่าเทียมกันร่วมกัน การเขียนแบบเดียวกันสำหรับพิกัด y และการต่อเชื่อมที่-Kให้นิพจน์

k>X-x>-K<Y-y<k

10

MATL, 14 11 10 5 4 ไบต์

tP->

โซลูชันนี้ยอมรับอินพุตในรูปแบบของสองอาร์เรย์:

  1. เมทริกซ์ 2 x 2 ที่มีพิกัดของมุม [x1, y1; x2, y2]
  2. อาร์เรย์ 2 x 1 ที่มีขนาดกำลังสอง [k2; k1]

ลองออนไลน์

เวอร์ชันที่แก้ไขเล็กน้อยเพื่อรันเคสทดสอบทั้งหมด

คำอธิบาย

        % Implicitly grab the first input
t       % Duplicate the input
P       % Flip along the first dimension (columns)
-       % Subtract the two to yield [x1-x2, y1-y2; x2-x1, y2-y1]
        % Implicitly grab the second input
>       % Compare with [k2, k1] (automatically broadcasts)
        % Implicitly display the truthy/falsey result

5

MATLAB, 36 21 ไบต์

@(a,b)a-flip(a)<[b,b]

ans(a,b)สร้างฟังก์ชั่นที่ไม่ระบุชื่อซึ่งสามารถประเมินเป็น ยอมรับอินพุตทั้งสองของรูปแบบต่อไปนี้:

  1. เมทริกซ์ 2 x 2 ที่มีมุมของแต่ละตารางเป็นหนึ่งแถว: [x1, y1; x2, y2].
  2. อาร์เรย์ 2 x 1 ที่มีขนาดของสี่เหลี่ยมสองตัว: [k2; k1]

ทุกกรณีทดสอบที่นี่

คำอธิบาย

นี่เป็นวิธีแก้ปัญหายกเลิกการตีกอล์ฟความเห็น

%// Example input
a = [1 1;
     0 1];

b = [1; 1];

%// Flip a along the first dimension and subtract from a to yield:
%// 
%// [x1-x2   y1-y2]
%// [x2-x1   y2-y1]
d = a - flip(a);

%// Compare this matrix element-wise with two horizontally concatenated copies 
%// of the second input [k2; k1]
result = d < [b,b];

%// Truthy values have all ones in the result and falsey values have at
%// least one 0 in the result.

ฉันไม่รู้ MATLAB ดังนั้นใจเพิ่มคำอธิบายหรือไม่
El'endia Starman

@ El'endiaStarman เพิ่มคำอธิบาย
Suever

4

JavaScript (ES6), 38 ไบต์

(a,b,c,d,e,f)=>d-a<c&a-d<f&e-b<c&b-e<f

หากd - ≥ แล้วตารางที่สองคือไปทางขวาของแรก ในทำนองเดียวกันเงื่อนไขอื่น ๆ ตรวจสอบว่าไม่ได้อยู่ทางซ้ายด้านล่างหรือด้านบน


3

เยลลี่ 8 ไบต์

Ṫṗ2+µ€f/

อินพุตคือรายการที่ซ้อนกัน[[x1, y1, k1], [x2, y2, k2]]เอาท์พุทเป็นรายการของพิกัดที่เพิ่มขึ้นทั้งหมดของจุดที่มีพิกัดจำนวนเต็มซึ่งเป็นเรื่องธรรมดาที่ทั้งสองสแควร์ (เท็จถ้าว่างจริง )

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

Ṫṗ2+µ€f/  Main link. Argument: [[x1, y1, k1], [x2, y2, k2]]

    µ     Combine the chain to the left into a link.
     €    Apply it to each list [xi, yi, ki].
Ṫ           Tail; pop and yield ki.
 ṗ2         Second Cartesian power; yield the list of all pairs [a, b] such that
            1 ≤ a ≤ ki and 1 ≤ b ≤ ki.
   +        Add [xi, yi] to each pair, yielding the list of all pairs [c, d] such
            that xi + 1 ≤ c ≤ xi + ki and yi + 1 ≤ d ≤ yi + ki.
      f/  Reduce by filter, intersecting the resulting lists of pairs.


1

Java, 78 ไบต์

Object o(int a,int b,int c,int d,int e,int f){return d-a<c&a-d<f&e-b<c&b-e<f;}

1
"อัลกอริทึม" จาก @Neil หรือไม่
Bálint

1
Objectreturn type สำหรับ -1 byte
Marv

@Marv เป็นสิ่งที่ถูกกฎหมายสำหรับกอล์ฟรหัส?
SuperJedi224

@ SuperJedi224 ทำไมจะไม่เป็นเช่นนั้น?
Marv

โอเคถ้าคุณพูดอย่างนั้น
SuperJedi224

1

อ็อกเทฟ 17 ไบต์

@(a,b)a-flip(a)<b

ตรรกะเดียวกับคำตอบ MATLAB ของฉันข้างต้นยกเว้นว่า Octave สนับสนุนกระจายเสียงอัตโนมัติของมิติเพื่อให้เราสามารถแทนที่ด้วยเพียง[b,b]b

กรณีทดสอบทั้งหมดที่นี่


1

SmileBASIC, 76 57 ไบต์

INPUT X,Y,W,S,T,U
SPSET.,X,Y,W,W
SPCOL.?!SPHITRC(S,T,U,U)

สร้าง sprite ด้วยขนาด / ตำแหน่งของสี่เหลี่ยมจัตุรัสแรกแล้วตรวจสอบว่ามันชนกับจตุรัสที่สองหรือไม่


1

x86-64 รหัสเครื่อง Windows 22 ไบต์

ลายเซ็น C ++:

extern "C" uint32_t __vectorcall squareOverlap(__m128i x, __m128i y, __m128i k);

ส่งกลับค่า 0 ถ้ากำลังสองไม่ซ้ำซ้อนและ -1 (0xFFFFFFFF) เป็นอย่างอื่น อินพุตเป็นเวกเตอร์ของจำนวนเต็ม 2 64- บิตสำหรับ x, y และ k ( _mm_set_epi64x(x1, x2)ฯลฯ )

squareOverlap@@48 proc
66 0F FB C8          psubq       xmm1,xmm0
0F 16 D2             movlhps     xmm2,xmm2
66 0F 38 37 D1       pcmpgtq     xmm2,xmm1
0F 12 CA             movhlps     xmm1,xmm2
0F 54 CA             andps       xmm1,xmm2
66 0F 7E C8          movd        eax,xmm1 
C3                   ret  
squareOverlap@@48 endp

1

05AB1E , 5 ไบต์

Â-›˜P

คำตอบMATLABของพอร์ตของ@Sueverพร้อมการแปลงเพิ่มเติมเป็นผลลัพธ์ความจริง / เท็จ อินพุตรูปแบบจึงยังเหมือนเดิม:
การป้อนข้อมูลเป็นครั้งแรกและใส่ที่สองเป็น[[x1,y1],[x2,y2]][k2,k1]

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

       # Bifurcate (short for Duplicate & Reverse copy) the (implicit) input-matrix
 -      # Subtract each value (vectorized) from the input-matrix we duplicated
       # Check for both values (vectorized) if it's larger than the (implicit) input-list
        # (We now have the same result as the MATL answer. In MATL a matrix/list consisting
        #  of only 1s is truthy. In 05AB1E this isn't the case however, so:)
    ˜   # Flatten the matrix to a single list
     P  # And take the product to check if all are truthy
        # (after which the result is output implicitly)  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.