Завдання
Напишіть програму або функцію, яка приймає зображення ширини w
та висоти h
, двох цілих чисел a <= w/2
і b <= h/2
та виводить зображення ascii art із розмірами a
x b
.
Мистецтво ascii має генеруватися за допомогою наступних кроків (або іншого процесу з тим же результатом):
Змініть розмір
w
xh
на2a
x2b
. Колір пікселя(x, y)
на зміненому зображенні повинен дорівнювати середньому кольорам усіх пікселів від вихідного зображення всередині прямокутника з такими кутами:(floor[x * w/2a], floor[y * h/2b]) (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
Зменшене зображення слід знежирити, взявши середнє значення червоного, зеленого та синього компонентів кольору та встановивши кожен компонент до цього середнього.
Символ повинен бути виведений для кожного блоку пікселів 2x2, дотримуючись наведених нижче правил:
- Нехай
e = 3 - floor[color/64]
, де колір позначає червону складову кольору верхнього лівого пікселя (в діапазоні 0..255). Нехайf
,g
іh
посилається на це значення, але для верхнього правого, нижнього лівого та нижнього правого пікселів відповідно. - Нехай
z
буде в середньомуe
,f
,g
,h
. - Виведіть символ, відповідний наступному (білий зображує піксель, де
3 - floor[color/64]
дорівнює нулю, а сірий - ненульовий). - = Виведіть пробіл (
)
- або = вихід ,
"
якщоe (or f) >= 2
і в'
іншому випадку. - або = вихід ,
,
якщоg (or h) >= 2
і в.
іншому випадку. - або = вихід
-
- або = вихід
;
- = Вихід
\
- = Вихід
/
- = Вихід
J
- = Вихід
L
- = Вихід
7
- = Вихід
P
-
z = 1
: вихід*
.z = 2
: вихідC
.z = 3
: вихід#
.
- Нехай
Інші зауваження: У всіх середніх значеннях, наведених у наведених вище кроках, слід використовувати ціле ділення (тобто округлення до 0).
Ви можете використовувати бібліотеку для читання зображень, але бібліотеки можуть не використовуватися для етапів зміни розміру та перенасичення.
Вхідні дані
Ваша програма буде містити три дані:
- Зображення. Це зображення може бути у будь-якому обраному вами форматі (наприклад, PNG, PPM)
- Ширина мистецтва ascii (у кількості символів)
- Висота мистецтва ascii (у кількості символів)
Вхід може бути прочитаний через STDIN, переданий як аргумент командного рядка, збережений у вигляді змінної тощо.
Вихідні дані
Ваша програма виведе мистецтво ascii, що генерується із зображення та за допомогою описаного вище процесу. Кожен рядок повинен мати однакову ширину (ширина, передана як вхідний), і жодних зайвих пробілів не можна додавати чи видаляти. В останньому рядку може бути наступний новий рядок, але це не є обов’язковим. Пусті лінії (рядки з пробілами) не повинні опускатися.
Приклади
Усі зображення були взяті з Вікіпедії та оприлюднені у відкритому доступі. Очікується, що ваша програма працюватиме для всіх зображень та дійсних даних.
Ширина = 52, висота = 25:
.-- *** - ----. - ********** L .-- .-- 7 ---- P- .J ****************. . ********* \. , ****************** L \ J ********** '. - ********************. J *********** L / J *********************; ./*************.L ; ********************* PJ **************; 7; . ********************** '. *************** ;; * ; **********************; ***************; J *. *********************** ******* P ******** '**; C ********************* C ******* P; *******. **; C ********************** J ***************; **; C *********************; ****************. **; ********************** '*************** P; ** J ********************* P *************** / *** . ********************** 7 ************* 'J **; ; ******************** C "'P *********** PJ ***" "7 ****************** C" '********** P. ** C; '* C *************'; ********* - J ** CP '* C ********** P 7 ** 7 ** P / - **** P - * CCCCC * P- '7 ******** P' '---' --- '
Ширина: 70, Висота: 3:
---------------------------. .---------------- J ***************************** P -J ***************** *** / J **; ---------- ********* P --------- '-------------------- - '
Ширина: 50, Висота: 25:
.J --- .J * P --- J * L--. J *** 'L -J *********** - J ****; **************** L ; ***** '.J ******************** J **** 7 ************************ P ** CC *; . ********* LJ *********** P- ** C * P 'J ********************** - 7 * C * L **********************; J * C **; **********************; JC ** C **. ; ; ******** CCC * C ** CCCC ** "7 ***** L. 7 ***** CCCCCC **** CC **" - *****. -J - ** C * C * CC ****** CC * ' ; ** CC ***; '** CCC ***** CCCC *; '- **** - - *** CCCCC *** - '------'
Ширина: 26, Висота: 17:
-, Л J - ** L .C # J '; * PL, C # " .PP 7. JC7P ;; * J ;; , C'C; J; CC; L C "# * L 7-P; *; ПК 7CL *** J * ПК '# '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" - '---
Це код-гольф , тому найкоротша відповідь виграє.