Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die ein Bild mit Breite w
und Höhe h
sowie zwei Ganzzahlen a <= w/2
und b <= h/2
eine ASCII-Darstellung des Bildes mit den Abmessungen a
x ausgibt b
.
Die ASCII-Grafik sollte durch die folgenden Schritte (oder einen anderen Prozess mit derselben Ausgabe) generiert werden:
Ändern Sie die Größe des
w
x-h
Bildes in2a
x2b
. Die Farbe des Pixels(x, y)
im Bild mit geänderter Größe sollte dem Durchschnitt der Farben aller Pixel des Originalbilds innerhalb des Rechtecks mit den folgenden Ecken entsprechen:(floor[x * w/2a], floor[y * h/2b]) (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
Das verkleinerte Bild sollte entsättigt werden, indem der Durchschnitt der roten, grünen und blauen Komponenten der Farbe ermittelt und jede Komponente auf diesen Durchschnitt eingestellt wird.
Für jeden 2x2 Pixelblock sollte ein Zeichen ausgegeben werden, wobei die folgenden Regeln zu beachten sind:
- Lassen
e = 3 - floor[color/64]
Farbe auf die Rotkomponente der Farbe des linken oberen Pixels bezieht (im Bereich 0..255). Lassen Sief
,g
undh
beziehen sich auf diesen Wert, aber für die oben rechts, unten links und unten rechts Pixel sind. - Sei
z
der Durchschnitt vone
,f
,g
,h
. - Geben Sie das folgende Zeichen aus (Weiß steht für ein Pixel mit
3 - floor[color/64]
Null und Grau für einen Wert ungleich Null). - = Leerzeichen ausgeben (
)
- oder = Ausgabe
"
wenne (or f) >= 2
und'
sonst. - oder = Ausgabe
,
wenng (or h) >= 2
und.
sonst. - oder = Ausgabe
-
- oder = Ausgabe
;
- = Ausgabe
\
- = Ausgabe
/
- = Ausgabe
J
- = Ausgabe
L
- = Ausgabe
7
- = Ausgabe
P
-
z = 1
: Ausgabe*
.z = 2
: AusgabeC
.z = 3
: Ausgabe#
.
- Lassen
Sonstige Hinweise: Bei allen in den obigen Schritten ermittelten Durchschnittswerten sollte eine Ganzzahldivision (dh eine Rundung auf 0) verwendet werden.
Sie können eine Bibliothek zum Lesen von Bildern verwenden, Bibliotheken werden jedoch möglicherweise nicht für die Größenänderungs- und Entsättigungsschritte verwendet.
Eingang
Ihr Programm nimmt drei Daten auf:
- Ein Bild. Dieses Bild kann in jedem Format Ihrer Wahl sein (zB PNG, PPM)
- Die Breite der ASCII-Kunst (in Anzahl der Zeichen)
- Die Höhe der ASCII-Kunst (in Anzahl der Zeichen)
Die Eingabe kann über STDIN gelesen, als Befehlszeilenargument übergeben, als Variable gespeichert usw. werden.
Ausgabe
Ihr Programm gibt die ASCII-Kunst aus, die aus dem Bild und durch den oben beschriebenen Prozess generiert wurde. Jede Zeile muss dieselbe Breite haben (die als Eingabe übergebene Breite), und es dürfen keine zusätzlichen Leerzeichen hinzugefügt oder entfernt werden. Die letzte Zeile enthält möglicherweise einen nachgestellten Zeilenumbruch, dies ist jedoch nicht obligatorisch. Leerzeilen (Zeilen mit nur Leerzeichen) dürfen nicht ausgelassen werden.
Beispiele
Alle Bilder wurden aus Wikipedia entnommen und als gemeinfrei veröffentlicht. Es wird erwartet, dass Ihr Programm für alle Bilder und gültigen Eingaben funktioniert.
Breite = 52, Höhe = 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' '---' --- '
Breite: 70, Höhe: 3:
---------------------------. .---------------- J ***************************** P -J ****************** *** / J **; ---------- ********* P --------- '-------------------- - '
Breite: 50, Höhe: 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 *** - '------'
Breite: 26, Höhe: 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 '- '---
Das ist Code-Golf , also gewinnt die kürzeste Antwort.