Tarea
Escriba un programa o función que tome una imagen de ancho w
y alto h
, y dos enteros a <= w/2
y b <= h/2
, y genere una representación artística de la imagen, con las dimensiones a
x b
.
El arte ascii debe generarse a través de los siguientes pasos (u otro proceso con el mismo resultado):
Cambiar el tamaño del
w
xh
imagen para2a
x2b
. El color del píxel(x, y)
en la imagen redimensionada debe ser igual al promedio de los colores de todos los píxeles de la imagen original dentro del rectángulo con las siguientes esquinas:(floor[x * w/2a], floor[y * h/2b]) (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
La imagen redimensionada debe desaturarse tomando el promedio de los componentes rojo, verde y azul del color, y configurando cada componente a este promedio.
Se debe generar un carácter para cada bloque de píxeles de 2x2, siguiendo las siguientes reglas:
- Let
e = 3 - floor[color/64]
, donde color se refiere al componente rojo del color del píxel superior izquierdo (en el rango 0..255). Dejef
,g
yh
consulte este valor, pero para los píxeles superior derecho, inferior izquierdo e inferior derecho respectivamente. - Vamos a
z
ser el promedio dee
,f
,g
,h
. - Imprima el carácter correspondiente a lo siguiente (el blanco representa un píxel donde
3 - floor[color/64]
es cero y el gris representa distinto de cero). - = Salida de un espacio (
)
- o = Salida
"
sie (or f) >= 2
y de lo'
contrario. - o = Salida
,
sig (or h) >= 2
y de lo.
contrario. - o = Salida
-
- o = Salida
;
- = Salida
\
- = Salida
/
- = Salida
J
- = Salida
L
- = Salida
7
- = Salida
P
-
z = 1
: salida*
.z = 2
: salidaC
.z = 3
: salida#
.
- Let
Otras notas: Todos los promedios tomados en los pasos anteriores deben usar la división de enteros (es decir, redondear hacia 0).
Puede usar una biblioteca para leer imágenes, pero las bibliotecas no pueden usarse para los pasos de cambio de tamaño y desaturación.
Entrada
Su programa tomará tres datos:
- Una imagen. Esta imagen puede estar en cualquier formato de su elección (por ejemplo, PNG, PPM)
- El ancho del arte ascii (en número de caracteres)
- La altura del arte ascii (en número de caracteres)
La entrada puede leerse a través de STDIN, pasar como un argumento de línea de comandos, almacenarse como una variable, etc.
Salida
Su programa generará el arte ascii generado a partir de la imagen y a través del proceso descrito anteriormente. Cada línea debe tener el mismo ancho (el ancho pasado como entrada), y no se pueden agregar ni quitar espacios adicionales. La última línea puede tener una nueva línea final, pero esto no es obligatorio. Las líneas en blanco (líneas con solo espacios) no deben omitirse.
Ejemplos
Todas las imágenes fueron tomadas de Wikipedia y lanzadas al dominio público. Se espera que su programa funcione para todas las imágenes y entradas válidas.
Ancho = 52, Altura = 25:
.-- *** - ----. - ********** L .-- .-- 7 ---- P- .J ****************. . ********* \. , ****************** L \ J ********** '. - ********************. J *********** L / J *********************; ./*************.L ; ********************* PJ **************; 7; . ********************** '. *************** ;; * ; **********************; ***************; J *. *********************** *******PAG********'**; C ********************* C ******* P; *******. **; C ********************** J ***************; **; C*********************; ****************. **; **********************' ***************PAG;** J ********************* P *************** / *** . ********************** 7 ************* 'J **; ; ******************** C "'P *********** PJ ***' "7 ****************** C" '********** P. ** C; '* C *************'; ********* - J ** CP '* C ********** P 7 ** 7 ** P / - **** P - * CCCCC * P- '7 ******** P' '---' --- '
Ancho: 70, Altura: 3:
---------------------------. .---------------- J ***************************** P -J ***************** *** / J **; ----------*********PAG---------' -------------------- - '
Ancho: 50, Altura: 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 *** - '------'
Ancho: 26, Altura: 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" - '---
Este es el código de golf , por lo que gana la respuesta más corta.