Lấy cảm hứng từ điều này .
Agatha Stephendale, một sinh viên năm hai thực sự say mê đồ họa raster, đã tham gia một khóa học về đại số tuyến tính. Bây giờ cô ấy tưởng tượng ma trận là hình chữ nhật, nhưng trong tâm trí nghệ thuật của mình, cô ấy gắn các đường chéo vào những hình chữ nhật đó và cố gắng tính toán dấu vết dọc theo chúng. Trong thực tế, cô ấy muốn tính toán dấu vết của tất cả các ma trận, không chỉ là hình vuông.
Vì Agatha là một nghệ sĩ, cô ấy biết cách vẽ các đường trong trình chỉnh sửa hình ảnh yêu thích của mình và sau này sử dụng thuật toán của Bresenham để vẽ các đường kẻ. Cô thậm chí đã kiểm tra Wikipedia và tìm thấy mã giả:
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
(Lưu ý rằng mã giả này chỉ hoạt động đối với độ dốc nhỏ hơn 1; đối với lưới điện cao, nên thực hiện một cách xử lý tương tự, nhưng với một vòng lặp y
. Xem phần này cho hai trường hợp.)
Agatha tưởng tượng một ma trận như một hình chữ nhật, vẽ một đường chéo trong đó và thuật toán của Bresenham xác định các phần tử nào của ma trận thuộc về đường chéo. Sau đó, cô ấy lấy số tiền của họ, và đây là những gì cô ấy muốn thực hiện trong càng ít byte càng tốt bởi vì cô ấy là một sinh viên nghèo và không đủ khả năng để có ổ cứng dung lượng lớn để lưu trữ mã của mình.
Bài tập
Đưa ra một ma trận A , trả về tổng của các phần tử nằm trên đường chéo chính rasterised (từ trên cùng bên trái xuống dưới bên phải), trong đó phần tử sau được xác định bởi thuật toán dòng của Bresenham. Nghĩa là, giả sử rằng ma trận đại diện cho lưới m × n , vẽ một đường thẳng trên lưới đó từ A [1, 1] đến A [m, n] bằng thuật toán của Bresenham và lấy tổng của tất cả các phần tử trên dòng. Lưu ý rằng đối với ma trận 1 × N và N × 1 , toàn bộ ma trận trở thành đường chéo của chính nó (vì đây là cách người ta vẽ một đường thẳng từ phần tử đầu tiên của hàng đầu tiên đến phần tử cuối cùng của hàng cuối cùng).
Đầu vào: ma trận thực (có thể là ma trận 1 × 1 , ma trận hàng, ma trận cột hoặc ma trận hình chữ nhật). Đầu ra: một số.
Lưu ý rằng một số nguồn (ví dụ: mã giả của Wikipedia ở trên) sử dụng kiểm tra điều kiện error≥0.5
, trong khi các nguồn khác sử dụng error>0.5
. Bạn nên sử dụng một ( error≥0.5
) được đăng ban đầu , nhưng nếu mã thay thế error>0.5
ngắn hơn trong mã của bạn, thì bạn được phép thực hiện nó (vì đây là mã golf), nhưng đề cập rõ ràng . Xem trường hợp kiểm tra 4.
Quy tắc thử thách
- Các định dạng I / O rất linh hoạt. Một ma trận có thể là một vài dòng số được phân tách bằng dấu cách được phân tách bằng dòng mới hoặc một mảng các vectơ hàng hoặc một mảng các vectơ cột, v.v.
- Đây là môn đánh gôn , vì vậy câu trả lời ngắn nhất bằng byte thắng.
- Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ.
- Lỗ hổng mặc định bị cấm.
Các trường hợp thử nghiệm
[[1,2,3],[4,5,6],[7,8,9]]
→1+5+9
→ đầu ra :15
.
[[1,2,3,4],[5,6,7,8]]
→1+2+7+8
→ đầu ra :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
→ đầu ra :75
.
[[1,2,3,4,5],[6,7,8,9,10]]
→1+2+8+9+10
(sử dụng≥
điều kiện lỗi) → đầu ra :30
.
Tuy nhiên, nếu việc sử dụng bất đẳng thức nghiêm ngặt >
trong mã của bạn sẽ ngắn hơn , thì đầu ra được phép là 1+2+3+9+10=25
, nhưng bạn nên đề cập riêng.
[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
→1+5+8+12
→ đầu ra :26
.
[[-0.3,0.5]]
→ đầu ra :0.2
.[[3.1],[2.9]]
→ đầu ra :6
.[[-5]]
→ đầu ra :-5
.
Thông tin thêm về thuật toán của Bresenham
- http://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_alacticm - một tập hợp các thuật toán cho các ngôn ngữ khác nhau;
- https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html - một lời giải thích hay có các trường hợp khác nhau cho các sườn dốc;
- https://en.wikipedia.org/wiki/Bresenham%27s_line_alacticm ;
[[1,2],[3,4],[5,6],[7,8],[9,10]]
28
(với ≥
, việc triển khai dự kiến) hoặc 27 (với >
, việc thực hiện tùy chọn.)
[[1,2,3,4,5],[6,7,8,9,10]]
.