Tarefa
Escreva um programa ou função que tire uma imagem de largura w
e altura h
, e dois números inteiros a <= w/2
e b <= h/2
, e produza uma representação artística da imagem, com as dimensões a
x b
.
A arte ascii deve ser gerada através das seguintes etapas (ou outro processo com a mesma saída):
Redimensionar o
w
xh
para2a
x2b
. A cor do pixel(x, y)
na imagem redimensionada deve ser igual à média das cores de todos os pixels da imagem original dentro do retângulo com os seguintes cantos:(floor[x * w/2a], floor[y * h/2b]) (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
A imagem redimensionada deve ser dessaturada tomando a média dos componentes vermelho, verde e azul da cor e definindo cada componente para essa média.
Um caractere deve ser emitido para cada bloco 2x2 de pixels, seguindo as regras abaixo:
- Deixe
e = 3 - floor[color/64]
, onde cor se refere ao componente vermelho da cor do pixel superior esquerdo (no intervalo de 0 a 255). Vamosf
,g
eh
referem-se a este valor, mas para o canto superior direito, canto inferior esquerdo, e pixels inferior direito, respectivamente. - Vamos
z
ser a média dee
,f
,g
,h
. - Emita o caractere correspondente ao seguinte (branco representa um pixel onde
3 - floor[color/64]
é zero e cinza representa diferente de zero). - = Saída de espaço (
)
- ou = Saída
"
see (or f) >= 2
e'
caso contrário. - ou = Saída
,
seg (or h) >= 2
e.
caso contrário. - ou = Saída
-
- ou = Saída
;
- = Saída
\
- = Saída
/
- = Saída
J
- = Saída
L
- = Saída
7
- = Saída
P
-
z = 1
: saída*
.z = 2
: saídaC
.z = 3
: saída#
.
- Deixe
Outras notas: Todas as médias tomadas nas etapas acima devem usar a divisão inteira (ou seja, arredondar para 0).
Você pode usar uma biblioteca para ler imagens, mas as bibliotecas não podem ser usadas para as etapas de redimensionamento e dessaturação.
Entrada
Seu programa coletará três dados:
- Uma imagem. Esta imagem pode estar em qualquer formato de sua escolha (por exemplo, PNG, PPM)
- A largura da arte ascii (em número de caracteres)
- A altura da arte ascii (em número de caracteres)
A entrada pode ser lida através de STDIN, passada como um argumento de linha de comando, armazenada como uma variável, etc.
Resultado
Seu programa exibirá a arte ascii gerada a partir da imagem e através do processo descrito acima. Cada linha deve ter a mesma largura (a largura passada como entrada) e nenhum espaço extra pode ser adicionado ou removido. A última linha pode ter uma nova linha à direita, mas isso não é obrigatório. Linhas em branco (linhas apenas com espaços) não devem ser omitidas.
Exemplos
Todas as imagens foram tiradas da Wikipedia e lançadas em domínio público. Espera-se que seu programa funcione para todas as imagens e entradas válidas.
Largura = 52, Altura = 25:
------ - ----. - ********** L .-- .-- 7 ---- P- .J ****************. . ********* \. , ****************** L \ J ********** '. - ********************. J *********** L / J *********************; ./*************.EU ; ********************* 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 - * CC0C * P- '7 ******** P' '---' --- '
Largura: 70, Altura: 3:
---------------------------. .---------------- J ***************************** P -J ***************** *** / J **; ---------- ********* P --------- '-------------------- - '
Largura: 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 ** CC0 ** "7 ***** L. 7 ***** CCCCCC **** CC ** ' - *****. -J - ** C * C * CC ****** CC * ' ; ** CC ***; '** CCC ***** ATCC *; «- **** - - *** SHIPC *** - '------'
Largura: 26, Altura: 17:
- ,EU 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 *' "CC0P" - '---
Isso é código-golfe , então a resposta mais curta vence.