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.
fonte
Respostas:
Javascript
752, 701Exemplos:
Limões:
Spuds:
Tux:
fonte
IDL 8,3,
588597588 bytesEstou recebendo valores um pouco diferentes do que você, não sei por que ... fiz divisão inteira para tudo. Mas, de outra forma, funciona esplendidamente ... esses resultados são aceitáveis?Muito melhor agora, embora ainda não seja idêntico por algum motivo.Casos de teste:
fonte