บอกฉันว่ามีกี่สี่เหลี่ยม?


12

กำหนดอาร์เรย์ 2 มิติที่ไม่ว่างเปล่าประกอบด้วย0และ1หาจำนวนของช่องสี่เหลี่ยมที่มีมุมทั้ง 4 1มีทั้งหมด สี่เหลี่ยมไม่จำเป็นต้องเป็น "ตั้งตรง" แถวทั้งหมดรับประกันว่ามีความยาวเท่ากัน

อนุญาตวิธีการอินพุต / เอาต์พุตที่เหมาะสม

Testcases:

0001000
1000000
0000000
0000100
0100000

ผลตอบแทน1นี้

10101
00000
10100
00000
10001

ผลตอบแทน2นี้

1111
1111
1111
1111

ผลตอบแทน20นี้

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในการชนะไบต์ ช่องโหว่มาตรฐานใช้


การตีความอีกอย่างถ้าฉันเข้าใจเจตนา: 4 1วินาทีบนสี่เหลี่ยมเช่นนั้น1ระยะทางเท่ากันจากปริมณฑลของทั้งสองประเทศ
feersum

@feersum เงื่อนไขหลังนี้เป็นจริงสำหรับทุกช่องใช่มั้ย
Wojowu

คำตอบ:


18

JavaScript (ES6), 127 124 119 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ nderscore

m=>(F=(x,y)=>m.map((r,Y)=>r.map((i,X)=>i?1/y?n+=x<X&y<=Y&(g=(a,b)=>(m[b+X-x]||0)[a-Y+y])(x,y)&g(X,Y):F(X,Y):0)))(n=0)|n

อย่างไร?

ฟังก์ชั่นนี้วนซ้ำทุกคู่ของเซลล์(x, y) , (X, Y)ของอินพุตเมทริกซ์mเช่น:

  • m [x, y] = m [X, Y] = 1
  • x <X
  • y ≤ Y

แต่ละคู่ที่ตรงกันจะอธิบายพิกัดของขอบที่มีศักยภาพของสี่เหลี่ยม ความไม่เท่าเทียมกันรับประกันว่าแต่ละขอบจะทดสอบเพียงครั้งเดียว

เราใช้เวกเตอร์[DX, DY] = [X - X, Y - Y]หมุน 90 °ตามเข็มนาฬิกาเพื่อทดสอบเซลล์อยู่ที่[x - DY, y + DX]และ[X - DY, Y + DX] หากทั้งคู่มี1เราพบสี่เหลี่ยมที่ถูกต้อง

สี่เหลี่ยม

กรณีทดสอบ


-2 ไบต์: g=(a,b)=>(m[b+X-x]||0)[a-Y+y]-1 ไบต์: ใช้|nแทน&&n
nderscore

6

MATL , 20 ไบต์

&fJ*+4XN!"@&-|un3=vs

อินพุตเป็นเมทริกซ์

ลองออนไลน์!

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

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

รหัสจะสร้างชุดค่าผสมทั้งหมด (ลำดับไม่สำคัญ) ของตัวเลขเหล่านี้ที่ถ่ายครั้งละ 4 ชุดค่าผสมแต่ละชุดแสดงถึงตัวเลือกจัตุรัส สำหรับการรวมกันแต่ละครั้งเมทริกซ์ 4 × 4 ของความแตกต่างสัมบูรณ์คู่ - ฉลาด (เช่นระยะทางในระนาบเชิงซ้อน) ถูกคำนวณ นี่คือเมทริกซ์สมมาตรที่มีศูนย์ตามแนวทแยงมุมหลัก ชุดค่าผสมปัจจุบันเป็นรูปสี่เหลี่ยมถ้าหากเมทริกซ์มีค่าแตกต่างกัน 3 ค่าเท่านั้น (ค่าเหล่านี้จะเป็นด้านสี่เหลี่ยมจตุรัสเส้นทแยงมุมและศูนย์):

ป้อนคำอธิบายรูปภาพที่นี่

ยกตัวอย่างเช่นในทางกลับกันสี่เหลี่ยมที่ไม่ได้เป็นสแควร์จะทำให้เกิดค่าที่แตกต่างกัน 4 ค่า (สองด้านค่าหนึ่งเส้นทแยงมุมและศูนย์)

ป้อนคำอธิบายรูปภาพที่นี่

และรูปสี่เหลี่ยมทั่วไปสามารถมีได้ถึง 7 ค่า (สี่ด้าน, สองเส้นทแยงมุมและศูนย์):

ป้อนคำอธิบายรูปภาพที่นี่

&f      % Input (implicit). Push vectors of row and column indices of nonzero entries
J*      % Multiply by imaginary unit
+       % Add the two vectors. Gives a vector of complex coordinates
4XN     % Matrix of combinations of these complex numbers, taken 4 at a time. Each
        % row is a combination
!       % Transpose
"       % For each column
  @     %   Push current column: candidate set of four points
  &-    %   All pair-wise differences
  |     %   Absolute value
  u     %   Unique entries
  n3=   %   Does the number of elements equal 3? Gives true (1) or false (0)
  vs    %   Concatenate vertically with previous accumulated result, and sum
        % End (implicit). Display (implicit)

มันทำงานยังไง?
Leun Nun

@LeakyNun คำอธิบายเพิ่มเติม
Luis Mendo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.