Agatha Stephendale นักเรียนปีหนึ่งที่มีความสนใจในกราฟิกแรสเตอร์ได้เข้าเรียนวิชาพีชคณิตเชิงเส้น ตอนนี้เธอนึกภาพเมทริกซ์เป็นรูปสี่เหลี่ยมผืนผ้า แต่ในความคิดทางศิลปะของเธอเธอยึดเส้นทแยงมุมเข้ากับรูปสี่เหลี่ยมผืนผ้าเหล่านั้นและพยายามคำนวณร่องรอยตามพวกเขา ในความเป็นจริงเธอต้องการคำนวณร่องรอยของเมทริกซ์ทั้งหมดไม่ใช่แค่กำลังสอง
เนื่องจาก Agatha เป็นศิลปินเธอรู้วิธีวาดลายเส้นในโปรแกรมแก้ไขภาพที่เธอโปรดปรานและอันหลังนั้นใช้อัลกอริธึมของ Bresenham ในการพล็อตไลน์ เธอยังตรวจสอบ Wikipedia และพบรหัสปลอม:
function line(x0, y0, x1, y1)
real deltax := x1 - x0
real deltay := y1 - y0
real deltaerr := abs(deltay / deltax) // Assume deltax != 0 (line is not vertical),
// note that this division needs to be done in a way that preserves the fractional part
real error := 0.0 // No error at start
int y := y0
for x from x0 to x1
plot(x,y)
error := error + deltaerr
while error ≥ 0.5 then
y := y + sign(deltay) * 1
error := error - 1.0
(โปรดทราบว่ารหัสเทียมนี้ทำงานได้เฉพาะกับความลาดชันน้อยกว่า 1; สำหรับกริดสูงควรทำการรักษาที่คล้ายกัน แต่มีการวนซ้ำy
ดูส่วนนี้สำหรับทั้งสองกรณี)
อกาธาจินตนาการว่าเมทริกซ์เป็นรูปสี่เหลี่ยมผืนผ้าลากเส้นในแนวทแยงมุมและอัลกอรึทึมของ Bresenham กำหนดองค์ประกอบของเมทริกซ์ที่อยู่ในแนวทแยง จากนั้นเธอก็นำผลรวมของพวกเขาและนี่คือสิ่งที่เธอต้องการที่จะดำเนินการในไม่กี่ไบต์เป็นไปได้เพราะเธอเป็นนักเรียนที่ยากจนและไม่สามารถจ่าย HDD ความจุขนาดใหญ่เพื่อจัดเก็บรหัสของเธอ
งาน
รับเมทริกซ์Aให้คืนค่าผลรวมขององค์ประกอบที่อยู่บนเส้นทแยงมุมหลัก rasterised (จากซ้ายไปขวาล่าง) ที่ซึ่งหลังถูกกำหนดโดยอัลกอริธึมบรรทัดของ Bresenham นั่นคือสมมติว่าเมทริกซ์แทนตาราง m × nวาดเส้นบนตารางจาก A [1, 1] ถึง A [m, n] โดยใช้อัลกอริทึมของ Bresenham และนำผลรวมขององค์ประกอบทั้งหมดในบรรทัด โปรดสังเกตว่าสำหรับเมทริกซ์1 × NและN × 1เมทริกซ์ทั้งหมดจะกลายเป็นเส้นทแยงมุมของตัวเอง (เพราะนี่คือวิธีที่เราวาดเส้นจากองค์ประกอบแรกของแถวแรกไปยังองค์ประกอบสุดท้ายของแถวสุดท้าย)
อินพุต:เมทริกซ์จริง (อาจเป็นเมทริกซ์ขนาด 1 × 1เมทริกซ์แถวเมทริกซ์คอลัมน์หรือเมทริกซ์สี่เหลี่ยม) ผลลัพธ์:ตัวเลข
ทราบว่าบางแหล่งที่มา (e. ก. วิกิพีเดียของ pseudocode ด้านบน) ใช้ตรวจสอบสภาพerror≥0.5
ในขณะที่แหล่งอื่น ๆ error>0.5
ที่ใช้ คุณควรใช้เดิมหนึ่ง ( error≥0.5
) แต่ถ้าทางเลือกerror>0.5
จะสั้นกว่าในรหัสของคุณแล้วคุณจะได้รับอนุญาตให้ใช้มัน (ตั้งแต่นี้เป็นรหัสกอล์ฟ) แต่พูดถึงมันอย่างชัดเจน ดูกรณีทดสอบ 4
กฏท้าทาย
- รูปแบบ I / O มีความยืดหยุ่น เมทริกซ์สามารถเป็นตัวเลขจำนวนหนึ่งที่คั่นด้วยช่องว่างคั่นด้วยการขึ้นบรรทัดใหม่หรืออาร์เรย์ของเวกเตอร์แถวหรืออาร์เรย์ของเวกเตอร์คอลัมน์ ฯลฯ
- นี่คือcode-golfดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
- กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชัน / เมธอดพร้อมพารามิเตอร์ที่เหมาะสมและชนิดผลตอบแทนโปรแกรมเต็มรูปแบบ
- ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
กรณีทดสอบ
[[1,2,3],[4,5,6],[7,8,9]]
→การ→การส่งออก:1+5+9
15
[[1,2,3,4],[5,6,7,8]]
→การ→การส่งออก:1+2+7+8
18
[[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24]]
→การ→การส่งออก:1+8+9+16+17+24
75
[[1,2,3,4,5],[6,7,8,9,10]]
→1+2+8+9+10
(โดยใช้≥
เงื่อนไขข้อผิดพลาด)30
→เอาท์พุท:
อย่างไรก็ตามถ้ามันสั้นกว่าที่จะใช้ความไม่เท่าเทียมที่เข้มงวด>
ในโค้ดของคุณเอาต์พุตที่ได้รับอนุญาตคือ1+2+3+9+10=25
แต่คุณควรพูดถึงมันแยกกัน
[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
→การ→การส่งออก:1+5+8+12
26
[[-0.3,0.5]]
0.2
→เอาท์พุท:[[3.1],[2.9]]
6
→เอาท์พุท:[[-5]]
-5
→เอาท์พุท:
ข้อมูลเพิ่มเติมเกี่ยวกับอัลกอริทึมของ Bresenham
- http://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm - ชุดของอัลกอริทึมสำหรับภาษาที่แตกต่างกัน
- https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html - คำอธิบายที่ดีเกี่ยวกับกรณีที่แตกต่างกันสำหรับความลาดชัน;
- https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm ;
[[1,2],[3,4],[5,6],[7,8],[9,10]]
28
(พร้อมกับ≥
การนำไปใช้ที่คาดหวัง) หรือ 27 (พร้อมกับ>
การนำไปปฏิบัติเสริม)
[[1,2,3,4,5],[6,7,8,9,10]]
กรณีทดสอบที่ขอ: