灵感来自此。
大二的阿加莎·斯蒂芬代尔(Agatha Stephendale)确实很喜欢栅格图形,他学习了线性代数课程。现在,她将矩阵想象为矩形,但是在她的艺术思想中,她将对角线附加到这些矩形上,并尝试计算沿它们的迹线。实际上,她想计算所有矩阵的迹线,而不仅仅是正方形。
由于Agatha是一位艺术家,她知道如何在自己喜欢的图像编辑器中绘制线条,而后者使用Bresenham的算法绘制线条。她甚至检查了维基百科,并找到了伪代码:
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
。有关两种情况,请参阅本节。)
阿加莎将矩阵想象成矩形,并在其中绘制一条对角线,布雷森纳姆的算法确定矩阵的哪些元素属于对角线。然后,她取它们的总和,这就是她想以尽可能少的字节实现的原因,因为她是一个贫穷的学生,无法负担大容量的HDD来存储她的代码。
任务
给定矩阵A,返回栅格化的主对角线上的元素之和(从左上到右下),后者由布雷森汉姆的线算法确定。也就是说,假设矩阵表示一个m×n的网格,请使用布雷森汉姆算法在该网格上从A [1,1]到A [m,n]画一条线,并取该线上所有元素的总和。请注意,对于1×N和N×1矩阵,整个矩阵将变成自己的对角线(因为这是从第一行的第一个元素到最后一行的最后一个元素画一条线的方式)。
输入:实数矩阵(可以是1×1矩阵,行矩阵,列矩阵或矩形矩阵)。 输出:一个数字。
请注意,某些来源(例如上述Wikipedia的伪代码)使用条件检查error≥0.5
,而其他来源使用error>0.5
。您应该使用最初发布的一个(error≥0.5
),但是如果替代error>0.5
代码在代码中较短,则可以实现它(因为这是代码高尔夫),但要明确提及。参见测试案例4。
挑战规则
- I / O格式很灵活。矩阵可以是用换行符分隔的几行以空格分隔的数字,也可以是行向量数组或列向量数组等。
- 这是代码高尔夫球,因此最短答案以字节为单位。
- 标准规则适用于您的答案,因此允许您使用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算法的更多信息
[[1,2],[3,4],[5,6],[7,8],[9,10]]
28
(使用≥
,预期的实现)或27(使用>
,可选实现。)
[[1,2,3,4,5],[6,7,8,9,10]]
。