Bài tập
Viết chương trình hoặc hàm lấy hình ảnh có chiều rộng w
và chiều cao h
, hai số nguyên a <= w/2
và b <= h/2
, và đưa ra biểu diễn nghệ thuật ascii của hình ảnh, với kích thước a
x b
.
Nghệ thuật ascii nên được tạo thông qua các bước sau (hoặc một quy trình khác có cùng đầu ra):
Thay đổi kích thước
w
xh
ảnh để2a
x2b
. Màu của pixel(x, y)
trong ảnh đã thay đổi kích thước phải bằng mức trung bình của màu của tất cả các pixel từ ảnh gốc bên trong hình chữ nhật với các góc sau:(floor[x * w/2a], floor[y * h/2b]) (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
Hình ảnh đã thay đổi kích thước phải được khử bão hòa bằng cách lấy trung bình của các thành phần màu đỏ, xanh lục và xanh lam của màu sắc và đặt từng thành phần về mức trung bình này.
Một ký tự phải được xuất ra cho mỗi khối pixel 2x2, theo các quy tắc dưới đây:
- Đặt
e = 3 - floor[color/64]
, trong đó màu sắc chỉ thành phần màu đỏ của màu của pixel trên cùng bên trái (trong phạm vi 0..255). Hãyf
,g
vàh
tham khảo giá trị này, nhưng đối với các pixel trên cùng bên phải, dưới cùng bên trái và dưới cùng bên phải. - Để cho
z
là mức trung bình củae
,f
,g
,h
. - Xuất ký tự tương ứng với các mục sau (màu trắng đại diện cho pixel trong đó
3 - floor[color/64]
bằng 0 và màu xám đại diện cho giá trị khác không). - = Xuất ra một khoảng trắng (
)
- hoặc = Đầu ra
"
nếue (or f) >= 2
và'
cách khác. - hoặc = Đầu ra
,
nếug (or h) >= 2
và.
cách khác. - hoặc = Đầu ra
-
- hoặc = Đầu ra
;
- = Đầu ra
\
- = Đầu ra
/
- = Đầu ra
J
- = Đầu ra
L
- = Đầu ra
7
- = Đầu ra
P
-
z = 1
: đầu ra*
.z = 2
: đầu raC
.z = 3
: đầu ra#
.
- Đặt
Lưu ý khác: Tất cả các giá trị trung bình được thực hiện trong các bước trên nên sử dụng phép chia số nguyên (nghĩa là làm tròn về 0).
Bạn có thể sử dụng thư viện để đọc ảnh, nhưng thư viện có thể không được sử dụng cho các bước thay đổi kích thước và giải phóng.
Đầu vào
Chương trình của bạn sẽ lấy ba phần dữ liệu:
- Một tấm ảnh. Hình ảnh này có thể ở bất kỳ định dạng nào bạn chọn (ví dụ: PNG, PPM)
- Chiều rộng của nghệ thuật ascii (tính theo số lượng ký tự)
- Chiều cao của nghệ thuật ascii (về số lượng nhân vật)
Đầu vào có thể được đọc qua STDIN, được truyền dưới dạng đối số dòng lệnh, được lưu dưới dạng biến, v.v.
Đầu ra
Chương trình của bạn sẽ xuất ra nghệ thuật ascii được tạo từ hình ảnh và thông qua quá trình được mô tả ở trên. Mỗi dòng phải có cùng chiều rộng (chiều rộng được chuyển làm đầu vào) và không được thêm hoặc xóa khoảng trắng. Dòng cuối cùng có thể có một dòng mới, nhưng điều này không bắt buộc. Các dòng trống (dòng chỉ có khoảng trắng) không được bỏ qua.
Ví dụ
Tất cả các hình ảnh được lấy từ Wikipedia và phát hành vào phạm vi công cộng. Chương trình của bạn dự kiến sẽ hoạt động cho tất cả các hình ảnh và đầu vào hợp lệ.
Chiều rộng = 52, Chiều cao = 25:
.-- *** - ----. - ********** L .-- .-- 7 ---- P- .J ****** / TÌM HIỂU. . , ****** / TÌM HIỂU L \ J ********** '. - ****** / TÌM HIỂU. J ****** TÌM J ****** / TÌM HIỂU; ./* / TÌM HIỂU. ; ****** / TÌM HIỂU; . ****** / TÌM HIỂU ; ****** / TÌM HIỂU; ****** / TÌM HIỂU; C ****** / TÌM HIỂU C ****** P; *******. **; C ****** / TÌM HIỂU C ****** ******; C ****** / TÌM HIỂU; ****** / TÌM HIỂU. **; ****** / TÌM HIỂU J ****** / TÌM HIỂU . ****** / TÌM HIỂU 7 ******. ; ****** / TÌM HIỂU C "'P ******. "7 ****** / TÌM HIỂU C" '********** P. ** C; '* C ****** / 4'; ****** - J ** CP '* C ********** P 7 ** 7 ** P / - **** P - * CCCCC * P- '7 ******** P' '---' --- '
Chiều rộng: 70, Chiều cao: 3:
---------------------------. .---------------- J ****** / TÌM HIỂU *** / J **; ---------- ****** / P --------- '-------------------- - '
Chiều rộng: 50, Chiều cao: 25:
.J --- .J * P --- J * L--. J *** 'L -J ****** - J ****; ****** / TÌM ; ***** '.J ****** / TÌM HIỂU J **** 7 ****** / TÌM HIỂU ** CC *; . ****** TÌM HIỂU ** C * P 'J ****** / TÌM HIỂU - 7 * C * L ****** / TÌM HIỂU; J * C **; ****** / TÌM HIỂU; JC ** C **. ; ; ******** CCC * C ** CCCC ** "7 ***** L. 7 ***** CCCCCC **** CC ** ' - *****. -J - ** C * C * CC ****** CC * ' ; ** CC ***; '** CCC ***** CCCC *; '- **** - - *** CCCCC *** - '------'
Chiều rộng: 26, Chiều cao: 17:
-, L J - ** L .C # J '; * PL, C # " .PP 7. JC7P ;; * J ;; , C'C; J; CC; L C "# * L 7-P; *; PC 7CL *** J * PC '# '7 # C * C # P'; P JC # C- J # CCC # L .JC # CJCC ## C; ; # - - #, CCC # CCCCCCCC ; * .- -.C; ; CCCCCCCCCCCC ; **** J ** L; CCCCCCCCCCCC ; ******; 'CCCCCCCCCCCP '******' CCCCCCCCCCC ' '* P-7 *' "CCCCP '- '---
Đây là môn đánh gôn , vì vậy câu trả lời ngắn nhất sẽ thắng.