これに触発された。
2年生のアガサスティーブンデールは、ラスターグラフィックスに真剣に取り組んでおり、線形代数のコースを取りました。今、彼女はマトリックスを長方形として想像していますが、彼女の芸術的な精神では、彼女はそれらの長方形に対角線を付け、それらに沿ってトレースを計算しようとします。実際、彼女は正方行列だけでなく、すべての行列のトレースを計算したいと考えています。
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
です。を参照してください。このセクションをです。2つのケースについては、を。)
アガサはマトリックスを長方形として想像し、その中に対角線を描き、ブレゼンハムのアルゴリズムはマトリックスのどの要素が対角に属するかを決定します。その後、彼女は合計額を受け取ります。これは、彼女が貧しい学生であり、コードを保存するための大容量HDDを購入できないため、できる限り少ないバイトで実装したいものです。
仕事
マトリックスAを指定すると、ラスタライズされた主対角線(左上から右下)にある要素の合計を返します。後者はBresenhamのラインアルゴリズムによって決定されます。つまり、行列がm×nグリッドを表すと仮定し、そのグリッド上にBresenhamのアルゴリズムを使用して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のアルゴリズムの詳細
- 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
(with ≥
、期待される実装)または27(with >
、オプションの実装)です。
[[1,2,3,4,5],[6,7,8,9,10]]
。