กริดสามารถโค้งงอ คุณอยู่นานเท่าไหร่


12

พิจารณาการวาดเส้นโค้งสองมิติที่เรียบง่ายและเปิดกว้างบน W กว้างด้วยกริดสูงของข้อความที่Xแสดงถึงส่วนหนึ่งของเส้นโค้งและ.แสดงพื้นที่ว่างและไม่มีการใช้อักขระอื่น

ทุกพื้นที่กริดมี 8 กริดกริดที่อยู่ใกล้เคียงคือละแวกมัวร์ พื้นที่กริดที่เกินขอบเขตจะถือว่าว่างเปล่า

กริดประกอบด้วยเส้นโค้งถ้ามันมีหนึ่งX หรือถ้ามันมีมากกว่าหนึ่งXที่:

  • ตรงสองXs Xมีเพียงหนึ่งที่อยู่ใกล้เคียง นี่คือจุดสิ้นสุดของเส้นโค้ง
  • ทุกคนXนอกเหนือจากปลายทางเพื่อนบ้านตรงสองXs รูปแบบเหล่านี้เป็นกลุ่มของเส้นโค้ง

ตัวอย่างเช่นกริดนี้ที่ W = 9 และ H = 4 มีเส้นโค้ง:

....X....
.X.X.X.X.
X..X..X.X
.XX.....X

เช่นกันกริดเหล่านี้ (W = 4, H = 3) มีเส้นโค้ง:

....  .X..  ....  ....  .X.X
....  X..X  ..X.  XX..  X.X.
..X.  .XX.  .X..  ....  ....

อย่างไรก็ตามกริดเหล่านี้ไม่มีเส้นโค้ง:

....  .XX.  ...X  XX..  ....  X.X.
....  X..X  ..XX  XX..  .X.X  .X..
....  .XX.  .X..  ....  ...X  X.X.

เราสามารถหาความยาวของเส้นโค้งโดยรวมระยะทางระหว่างคู่ที่อยู่ใกล้เคียงทั้งหมดของXs:

  • ระยะห่างระหว่างสอง orthogonally เพื่อนบ้านXs คือ 1 หน่วย

    XX
    X
    X
  • ระยะห่างระหว่างสองข้างที่อยู่ติดกันในแนวทแยงมุมXคือ√2หน่วย

    X.
    .X
    .X
    X.

ตัวอย่างเช่นความยาวของเส้นโค้งในตาราง

XXX.
...X
..X.

สามารถมองเห็นเป็น

ตัวอย่างความยาว

เพื่อให้เราเห็นว่าเป็น 1 + 1 + √2 + √2 = 4.828427 ...

ความยาวของเส้นโค้งที่มีเพียงเส้นเดียวXคือศูนย์

เมื่อกริดไม่ได้สร้างเส้นโค้งความยาวของมันจะไม่ถูกกำหนดอย่างชัดเจน

ท้าทาย

ให้กริดของข้อความของXs และ.s, เอาท์พุทความยาวของเส้นโค้งที่บรรจุไว้, หรือส่งออกบางอย่างเช่น-1หรือNullเพื่อระบุว่ากริดไม่มีเส้นโค้ง

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

คุณอาจเอาท์พุทลอยสำหรับความยาวเส้นโค้งหรือหรือจำนวนเต็มสองจำนวน A และ B length = A + B*√2ที่

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

XXX.
...X
..X.
2 + 2*√2 = 4.828427...

....X....
.X.X.X.X.
X..X..X.X
.XX.....X
3 + 8*√2 = 14.313708...

....
....
..X.
0 + 0*√2 = 0

.X..
X..X
.XX.
1 + 3*√2 = 5.242640...

....
..X.
.X..
0 + 1*√2 = 1.414213...

....
XX..
....
1 + 0*√2 = 1

.X.X
X.X.
....
0 + 3*√2 = 4.242640...

....
....
....
....
-1

.XX.
X..X
.XX.
-1

...X
..XX
.X..
-1

....
.X.X
...X
-1

X.X.
.X..
X.X.
-1

ฉันขอแนะนำให้นักแก้ปัญหาสามารถเลือกรูปแบบผลลัพธ์ของพวกเขาสำหรับกริดที่ไม่มีส่วนโค้ง (ค่าคงที่ใด ๆ ที่ไม่ใช่รูปแบบ m + n * sqrt (2) สำหรับ m, n≥0)
Greg Martin

@Greg ฟังดูดี เสร็จสิ้น
งานอดิเรกของ Calvin

[x.x,...,.x.]ไม่ใช่เส้นโค้งที่ถูกต้องใช่ไหม
Magic Octopus Urn

@carusocomputing แก้ไข
งานอดิเรกของ Calvin

คำตอบ:


3

MATL , 52 51 ไบต์

t2Y6~Z+*ssGt3Y6Z+*tt1=z2=wssGzqE=*Gz1=+?}_q]ssy-h2/

อินพุตเป็นเมทริกซ์ของศูนย์และอัน

ผลผลิตที่แล้วB Non-โค้งให้ลบAA

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

คำอธิบาย

การคำนวณความยาวของเส้นโค้งใช้สองมิติ convolutions 1 : หนึ่งกับหน้ากากมัวร์และอีกด้วยหน้ากากที่มีเพียงเพื่อนบ้านในแนวทแยง ผลลัพธ์เป็นเมทริกซ์สองตัวที่มีขนาดเดียวกันกับอินพุตซึ่งจะแทนด้วยMและDตามลำดับ Mให้จำนวนเพื่อนบ้านทั้งหมดสำหรับแต่ละจุดในขณะที่Dให้จำนวนเพื่อนบ้านในแนวทแยง

ผลลัพธ์ในMและDต้องถูกกรองเพื่อละทิ้งจุดที่ไม่ได้อยู่ในส่วนโค้ง นอกจากนี้พวกเขาจะต้องหารด้วย 2 เพราะ "การเป็นเพื่อนบ้านของ" นั้นเป็นความสัมพันธ์แบบสมมาตรดังนั้นแต่ละจุดในโค้งจะถูกนับสองครั้ง

การพิจารณาว่าเส้นโค้งที่ถูกต้องนั้นยุ่งยากกว่าที่ฉันคาดไว้หรือไม่ เมื่อต้องการทำเช่นนี้รหัสทดสอบเงื่อนไขที่สาม:

  1. จำนวนของคนในMเท่ากัน2หรือไม่? (นั่นคือมีสองจุดกับเพื่อนบ้านคนเดียวหรือเปล่า?)
  2. ผลรวมทั้งหมดของMเท่ากับจำนวนคะแนนในกราฟเส้นเข้าคูณ2ด้วยลบ2หรือไม่? (พร้อมกับเงื่อนไข 1 จะทดสอบว่าค่าที่ไม่ใช่ศูนย์ทั้งหมดในMยกเว้นสองค่าเท่ากัน2)
  3. กราฟอินพุตมีจุดเดียวหรือไม่?

เส้นโค้งถูกต้องถ้าเงื่อนไข 1 และ 2 เป็นจริงหรือถ้าเงื่อนไข 3 คือ

t       % Implicit input matrix of zeros and ones. Duplicate
2Y6~    % Push [1 0 1; 0 0 0; 1 0 1]
Z+      % 2D convolution, keeping size
*       % Multiply to zero out results for non-curve points. Gives matrix D
ss      % Sum of matrix D
Gt      % Push input again wtice
3Y6     % Push [1 1 1; 1 0 1; 1 1 1]
Z+      % 2D convolution, keeping size
*       % Multiply to zero out results for non-curve points. Gives matrix M
tt      % Duplicate twice
1=z     % Number of ones
2=      % Does it equal 2? This is condition 1
wss     % Swap. Sum of matrix
G       % Push input again
zqE     % Number of nonzeros values minus 1, and then multiplied by 2
=       % Are they equal? This is condition 2
*       % Multiply. This is a logical AND of conditions 1 and 2
G       % Push input again
z1=     % Does it contain exactly one nonzero value? This is condition 3
+       % Add. This is a logical OR with condition 3
?}      % If result was false
  _q    %   Negate and subtract 1. This makes sure we get a negative value
]       % End
ss      % Sum of matrix M
y       % Duplicate sum of matrix D from below
-       % Subtract
h       % Concatenate horizontally
2/      % Divide by 2. Implicitly display

1 บิดเป็นกุญแจสำคัญสู่ความสำเร็จ


1

Python 3 , 316 315 311 ไบต์

ฉันคิดว่านี่ครอบคลุมทุกกรณี อย่างน้อยกรณีทดสอบใช้งานได้

ยิ่งไปกว่านั้นยังมีอะไรอีกมากที่จะต้องเล่นกอล์ฟซึ่งอาจเป็นจุดเริ่มต้นที่มีการจัดการเคสแบบขอบ

def f(d,R,C):
 s=sum;d=[0]*(C+2),*[[0,*r,0]for r in d],[0]*(C+2);o=-1,0,1;k=[[[(1,0),(0,1)][i*j]for i in o for j in o if d[r+i][c+j]and i|j]for c in range(1,-~C)for r in range(1,-~R)if d[r][c]];w=[x/2for x in map(s,zip(*s(k,[])))]or[0,0];print([w,-1][s(w)!=s([s(z)for z in d])-1or[len(t)for t in k].count(1)>2])

ลองออนไลน์!

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

  1. d,R,C 1. รายการของรายการที่มี 1 เป็นเส้นโค้งและ 0 เป็นพื้นหลัง 2. จำนวนแถวและคอลัมน์
  2. แทรกแถว 0 ก่อนและหลังและคอลัมน์ 0 ก่อนและหลังdดังนั้นเราไม่ต้องกังวลเกี่ยวกับขอบของอาร์เรย์ 2d
  3. สำหรับทุก ๆ 1 ในอาเรย์ 2d ให้สแกนย่านของ 1 และเพิ่ม (1,0) ลงในรายการหากความสัมพันธ์นั้นเป็นเส้นทแยงมุมหรือเพิ่มอีก (0,1)
  4. รวม tuples ทั้งหมดเพื่อให้ (n, m) แทนจำนวนเพื่อนบ้านที่เป็นเส้นทแยงมุมและไม่ใช่เส้นทแยงมุมตามลำดับ
  5. ตรวจสอบว่าจำนวนของความสัมพันธ์เป็นจำนวนที่แน่นอนของ 1 ลบหนึ่งหรือไม่; ถ้าไม่ไม่ใช่เส้นโค้ง

ขอบคุณ @Helka Homba ที่ชี้กรณีที่หายไป ขอบคุณ @TuukkaX และ @Trelzevir สำหรับเคล็ดลับการเล่นกอล์ฟ


ดูเหมือนว่าd=[[1,0,1],[0,1,0],[1,0,1]]จะล้มเหลวที่นี่ (เพิ่ม testcase)
งานอดิเรกของ Calvin

@HelkaHomba คุณถูกต้องฉันตรวจสอบว่า ขอบคุณ! แก้ไข (ตอนนี้น่าเสียดายที่มีจำนวนไบต์เพิ่มขึ้น)
แม่น้ำไนล์

1
s=sumบันทึก 4 ไบต์
Trelzevir

0

Mathematica, 153 150 ไบต์

Switch[Sort[Join@@BlockMap[If[#[[2,2]]<1,Nothing,Tr[Tr/@#]]&,#~ArrayPad~1,{3,3},1]],{1},0,{2,2,3...},1/.#~ComponentMeasurements~"PolygonalLength",_,]&

รับอาร์เรย์ 2 มิติด้วย0s สำหรับ.s และ1s สำหรับXs เอาท์พุทNullสำหรับเส้นโค้งที่ไม่ใช่

1/.#~ComponentMeasurements~"PolygonalLength"&

Mathematica มี 45 ไบต์ในตัวนี้ แต่มันจะออกผลลัพธ์ตัวเลขบางอย่างสำหรับเส้นโค้งบุหรี่และ 1 / sqrt (2) {{1}}สำหรับการป้อนข้อมูล การแก้ไขค่าใช้จ่ายเหล่านี้ 105 ไบต์ (สามารถเล่นกอล์ฟได้)

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