Một trong những phần quan trọng của thuật toán nén của PNG là phép biến đổi Paeth, biến đổi hình ảnh theo cách làm cho nó nén tốt hơn (thông thường). Trong thử thách này, nhiệm vụ của bạn là viết một chương trình để tính toán một phép biến đổi Paeth. Hoạt động của một chuyển đổi Paeth được mô tả dưới đây.
Sự chuyển đổi Paeth
Phép biến đổi Paeth trừ đi từng thành viên X
của mảng 2 chiều một yếu tố dự đoán. Công cụ dự đoán là phần tử của thành viên mảng ở bên trái ( A
), top ( B
) và top-left ( C
) X
có giá trị có ít khác biệt nhất A + B - C
.
┼─┼─┼
│C│B│
┼─┼─┼
│A│X│
┼─┼─┼
Nếu một trong A
, B
hoặc C
, nằm ngoài giới hạn, giá trị của nó được thay thế bằng 0. Đây là mã giả từ đặc tả PNG nêu rõ cách tính toán của công cụ dự đoán này:
function PaethPredictor (a, b, c)
begin
; a = left, b = above, c = upper left
p := a + b - c ; initial estimate
pa := abs(p - a) ; distances to a, b, c
pb := abs(p - b)
pc := abs(p - c)
; return nearest of a,b,c,
; breaking ties in order a,b,c.
if pa <= pb AND pa <= pc then return a
else if pb <= pc then return b
else return c
end
Đối với thử thách này, các thành viên mảng là các số tự nhiên trong phạm vi từ 0 đến 255. Nếu phép biến đổi Paeth dẫn đến một giá trị nằm ngoài phạm vi đó, nó sẽ bị giảm modulo 256 thành một giá trị trong phạm vi đó.
Đầu vào và đầu ra
Đầu vào là hai số nguyên x và y trong phạm vi từ 2 đến 1023 biểu thị chiều rộng và chiều cao của ma trận để biến đổi và một mảng các phần tử x × y . Đầu vào được định dạng dưới dạng số thập phân cách nhau bởi một ký tự trống được kết thúc bằng nguồn cấp dữ liệu. Đây là những gì đầu vào này có thể trông như sau:
2 3 4 5 6 7 8 9
Điều này sẽ đại diện cho một ma trận 2 nhân 3 với các mục:
4 5
6 7
8 9
Đầu ra phải có cùng định dạng với đầu vào với sự thư giãn rằng các số có thể được phân tách bằng một lượng ký tự khoảng trắng khác không tùy ý (dấu cách, tab ngang hoặc dọc, nguồn cấp dữ liệu hoặc biểu mẫu) và bị chấm dứt bởi một lượng tùy ý ký tự khoảng trắng.
Đầu vào sẽ được nhận từ stdin
, đầu ra sẽ đi đến stdout
. Nếu điều này là không thể, hãy chọn một cách khác để nhận đầu vào và ghi đầu ra không mã hóa đầu vào.
Hành vi của chương trình của bạn khi được trình bày với đầu vào không hợp lệ không phải là một phần của thách thức này.
Đánh giá và thực hiện tham khảo
Một chương trình ANSI C được cung cấp để tạo đầu vào mẫu, giải quyết các trường hợp và xác minh các giải pháp. Gọi chương trình với g
để g enerate đầu vào, với s
tới s olve một ví dụ đầu vào và với v
tới v erify đúng đắn của một giải pháp.
Nếu bạn nghĩ rằng việc thực hiện tham chiếu là bị lỗi, xin vui lòng cho tôi biết để tôi có thể sửa nó càng sớm càng tốt.
Ví dụ đầu vào và đầu ra
Theo yêu cầu phổ biến.
10 5 166 156 108 96 63 227 122 99 117 135 125 46 169 247 116 55 151 1 232 114 214 254 6 127 217 88 206 102 252 237 75 250 202 145 86 198 172 84 68 114 58 228 66 224 186 217 210 108 11 179
đại diện cho mảng
166 156 108 96 63 227 122 99 117 135
125 46 169 247 116 55 151 1 232 114
214 254 6 127 217 88 206 102 252 237
75 250 202 145 86 198 172 84 68 114
58 228 66 224 186 217 210 108 11 179
được chuyển thành
166 246 208 244 223 164 151 233 18 18
215 177 123 78 125 84 96 135 231 138
89 129 8 121 101 228 55 101 20 123
117 175 196 199 125 112 222 238 72 46
239 234 120 158 41 19 12 24 183 111
được mã hóa thành
10 5 166 246 208 244 223 164 151 233 18 18 215 177 123 78 125 84 96 135 231 138 89 129 8 121 101 228 55 101 20 123 117 175 196 199 125 112 222 238 72 46 239 234 120 158 41 19 12 24 183 111
Điều kiện chiến thắng
Đối với thử thách này, hãy viết chương trình tạo chuyển đổi Paeth chính xác của đầu vào và viết chúng ra. Đây là code-golf, chương trình có số lượng ký tự ít nhất trong mã nguồn của nó sẽ thắng. Vui lòng thử đính kèm một lời giải thích và một phiên bản mã có thể đọc được vào trình của bạn để người khác có thể thấy những gì nó làm.