Compito
Scrivi un programma o una funzione che acquisisca un'immagine di larghezza w
e altezza h
, e due numeri interi a <= w/2
e b <= h/2
, e generi una rappresentazione ascii art dell'immagine, con le dimensioni a
x b
.
L'arte ascii dovrebbe essere generata attraverso i seguenti passaggi (o un altro processo con lo stesso output):
Ridimensionare l'
w
xh
immagine da2a
x2b
. Il colore del pixel(x, y)
nell'immagine ridimensionata dovrebbe essere uguale alla media dei colori di tutti i pixel dall'immagine originale all'interno del rettangolo con i seguenti angoli:(floor[x * w/2a], floor[y * h/2b]) (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
L'immagine ridimensionata deve essere desaturata prendendo la media dei componenti rosso, verde e blu del colore e impostando ciascun componente su questa media.
Un carattere deve essere emesso per ogni blocco di pixel 2x2, seguendo le regole seguenti:
- Lascia
e = 3 - floor[color/64]
, dove il colore si riferisce al componente rosso del colore del pixel in alto a sinistra (nell'intervallo 0..255). Consentif
,g
eh
fai riferimento a questo valore, ma rispettivamente per i pixel in alto a destra, in basso a sinistra e in basso a destra. - Lasciate
z
essere la media die
,f
,g
,h
. - Emette il carattere corrispondente al seguente (il bianco rappresenta un pixel dove
3 - floor[color/64]
è zero e il grigio rappresenta diverso da zero). - = Output uno spazio (
)
- oppure = Output
"
see (or f) >= 2
e'
altrimenti. - oppure = Output
,
seg (or h) >= 2
e.
altrimenti. - oppure = Uscita
-
- oppure = Uscita
;
- = Uscita
\
- = Uscita
/
- = Uscita
J
- = Uscita
L
- = Uscita
7
- = Uscita
P
-
z = 1
: output*
.z = 2
: outputC
.z = 3
: output#
.
- Lascia
Altre note: tutte le medie prese nei passaggi precedenti dovrebbero usare la divisione intera (ovvero arrotondare verso 0).
È possibile utilizzare una libreria per leggere le immagini, ma le librerie non possono essere utilizzate per le fasi di ridimensionamento e desaturazione.
Ingresso
Il tuo programma prenderà tre dati:
- Un'immagine. Questa immagine può essere in qualsiasi formato di tua scelta (ad esempio PNG, PPM)
- La larghezza dell'arte ascii (in numero di caratteri)
- L'altezza dell'arte ascii (in numero di caratteri)
L'input può essere letto tramite STDIN, passato come argomento della riga di comando, memorizzato come variabile, ecc.
Produzione
Il tuo programma produrrà l'arte ascii generata dall'immagine e attraverso il processo sopra descritto. Ogni riga deve avere la stessa larghezza (la larghezza passata come input) e non è possibile aggiungere o rimuovere spazi aggiuntivi. L'ultima riga potrebbe avere una nuova riga finale, ma ciò non è obbligatorio. Le righe vuote (righe con solo spazi) non devono essere omesse.
Esempi
Tutte le immagini sono state prese da Wikipedia e rese di dominio pubblico. Il programma dovrebbe funzionare con tutte le immagini e gli input validi.
Larghezza = 52, Altezza = 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' '---' --- '
Larghezza: 70, Altezza: 3:
---------------------------. .---------------- J ***************************** P -J ***************** *** / J **; ---------- ********* P --------- '-------------------- -'
Larghezza: 50, Altezza: 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 *** - '------'
Larghezza: 26, Altezza: 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; ;#- -#, CCCCCCCCCCC ; * .- -.C; ; CCCCCCCCCCCC ; **** J ** L; CCCCCCCCCCCC ; *******; 'CCCCCCCCCCCP '*******' CCCCCCCCCCC' '* P-7 *' "CCCCP '- '---
Questo è code-golf , quindi vince la risposta più breve.