Натхненний цим .
Агата Стефандейл, другакурсниця, яка справді займається растровою графікою, пройшла курс лінійної алгебри. Тепер вона уявляє матриці прямокутниками, але в своєму художньому розумі вона приєднує до цих прямокутників діагональні лінії і намагається обчислити сліди вздовж них. Насправді вона хоче обчислити сліди всіх матриць, а не лише квадратних.
Оскільки Агата - художниця, вона знає, як малювати лінії у своєму улюбленому редакторі зображень, а останній використовує алгоритм Брезенама для побудови сюжетних ліній. Вона навіть перевірила Вікіпедію і виявила псевдокод:
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
. Перегляньте цей розділ для двох випадків.)
Агата уявляє матрицю як прямокутник, малює в ній діагональну лінію, а алгоритм Брезенама визначає, які елементи матриці належать до діагоналі. Потім вона бере їх суму, і це те, що вона хоче реалізувати якомога менше байтів, оскільки вона бідна студентка і не може дозволити собі жорсткі диски великої ємності для зберігання свого коду.
Завдання
Задавши матрицю А , поверніть суму елементів, що лежать на розсіяній головній діагоналі (зверху ліворуч донизу праворуч), де остання визначається лінійним алгоритмом Брезена. Тобто, припускаючи, що матриця являє собою сітку m × n , намалюйте лінію на цій сітці від A [1, 1] до A [m, n], використовуючи алгоритм Брезена, і візьміть суму всіх елементів на лінії. Зауважте, що для матриць 1 × N та N × 1 вся матриця стає власною діагоналлю (адже саме так можна було б намалювати лінію від першого елемента першого ряду до останнього елемента останнього рядка).
Введення: реальна матриця (може бути матрицею 1 × 1 , рядковою матрицею, матрицею стовпців або прямокутною матрицею). Вихід: число.
Зауважте, що деякі джерела (наприклад, псевдокод Вікіпедії вище) використовують перевірку стану error≥0.5
, а інші використовують error>0.5
. Вам слід скористатись оригіналом, розміщеним на екрані ( error≥0.5
), але якщо альтернатива error>0.5
коротше у вашому коді, тоді вам дозволяється його реалізувати (оскільки це код гольфу), але чітко згадати про це . Дивіться тестовий випадок 4.
Правила виклику
- Формати вводу / виводу є гнучкими. Матриця може бути декількома рядками з обмеженими пробілами числами, розділеними новими рядками, або масивом векторів рядків, або масивом векторів стовпців тощо.
- Це код-гольф , тому найкоротша відповідь у байтах виграє.
- Стандартні правила застосовуються до вашої відповіді, тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу return.
- Бійниці за замовчуванням заборонені.
Тестові справи
[[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
.
Детальніше про алгоритм Брезхема
- 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]]
.