Nén một ma trận thưa thớt bằng cách sử dụng hàng thưa nén (định dạng CSR, CRS hoặc Yale) .
Đây là tất cả các hình thức nén (bỏ qua Yale mới).
Đầu vào có thể là bất kỳ cấu trúc dữ liệu 2d nào (danh sách các danh sách, v.v.): vd
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Và đầu ra phải là ba cấu trúc dữ liệu 1d (danh sách, v.v.), biểu thị các đầu ra A
, IA
và JA
, ví dụ
[5, 8, 3, 6]
[0, 0, 2, 3, 4]
[0, 1, 2, 1,]
Quá trình này được mô tả bởi wikipedia:
Mảng A có độ dài NNZ và giữ tất cả các mục nhập khác của M theo thứ tự từ trái sang phải từ trên xuống dưới ("hàng chính").
Mảng IA có độ dài m + 1. Nó được định nghĩa bởi định nghĩa đệ quy này:
IA [0] = 0 IA [i] = IA [i - 1] + (số phần tử khác không trên hàng thứ (i - 1) trong ma trận gốc)
Do đó, các phần tử m đầu tiên của IA lưu chỉ mục vào A của phần tử khác 0 đầu tiên trong mỗi hàng của M và phần tử cuối cùng IA [m] lưu trữ NNZ, số phần tử trong A, cũng có thể được coi là chỉ số trong A của phần tử đầu tiên của một hàng ma ngay bên ngoài phần cuối của ma trận M. Các giá trị của hàng thứ i của ma trận gốc được đọc từ các phần tử A [IA [i]] đến A [IA [i + 1] - 1] (bao gồm cả hai đầu), tức là từ đầu một hàng đến chỉ mục cuối cùng ngay trước khi bắt đầu tiếp theo. [5]
Mảng thứ ba, JA, chứa chỉ số cột trong M của mỗi phần tử của A và do đó cũng có độ dài NNZ.
Nếu ngôn ngữ của bạn không hỗ trợ cấu trúc dữ liệu thực tế, đầu vào và đầu ra có thể là văn bản.
Các trường hợp thử nghiệm
Đầu vào 1:
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Đầu ra 1:
[ 5, 8, 3, 6 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Đầu vào 2
[[10 20 0 0 0 0],
[0 30 0 40 0 0],
[0 0 50 60 70 0],
[0 0 0 0 0 80]]
Đầu ra 2:
[ 10 20 30 40 50 60 70 80 ]
[ 0 2 4 7 8 ]
[ 0 1 1 3 2 3 4 5 ]
Đầu vào 3:
[[0 0 0],
[0 0 0],
[0 0 0]]
Đầu ra 3:
[ ]
[ 0 0 0 0 ]
[ ]
Đầu vào 4:
[[1 1 1],
[1 1 1],
[1 1 1]]
Đầu ra 4:
[ 1 1 1 1 1 1 1 1 1 ]
[ 0 3 6 9 ]
[ 0 1 2 0 1 2 0 1 2 ]
Đầu vào 5:
[[0 0 0 0],
[5 -9 0 0],
[0 0 0.3 0],
[0 -400 0 0]]
Đầu ra 5:
[ 5, -9, 0.3, -400 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Giả sử đầu vào có thể chứa bất kỳ số thực nào, bạn không cần xem xét các ký hiệu toán học hoặc biểu diễn theo cấp số nhân (ví dụ: 5.000 sẽ không bao giờ được nhập dưới dạng 5e3). Bạn sẽ không cần phải xử lý inf
, -inf
, NaN
hoặc bất kỳ khác 'giả số'. Bạn có thể xuất một đại diện khác của số (5.000 có thể là đầu ra là 5e3 nếu bạn chọn).
Ghi điểm:
Đây là một môn đánh gôn , ít byte nhất sẽ thắng.
Bảng xếp hạng
Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.
Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:
# Language Name, N bytes
nơi N
là kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:
# Perl, 43 + 2 (-p flag) = 45 bytes
Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
IA[0] = 0
hoàn toàn không cần thiết? Chỉ cần xác định IA[i] = IA[i − 1]...
, nhưng chúng ta chỉ có thể nói rằng nếu i-1 < 0
sử dụng 0. Nghĩa là, IA [0] luôn bằng 0, do đó nó có thể được nén ra (vâng, tôi nhận ra rằng đây là một bài phê bình về thuật toán, không phải thử thách này).