Tâche
Écrivez un programme ou une fonction qui prend une image de largeur w
et de hauteur h
, et deux entiers a <= w/2
et b <= h/2
, et produit une représentation ascii art de l'image, avec les dimensions a
x b
.
L'art ascii doit être généré à travers les étapes suivantes (ou un autre processus avec la même sortie):
Redimensionner la
w
xh
image pour2a
x2b
. La couleur du pixel(x, y)
dans l'image redimensionnée doit être égale à la moyenne des couleurs de tous les pixels de l'image d'origine à l'intérieur du rectangle avec les coins suivants:(floor[x * w/2a], floor[y * h/2b]) (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
L'image redimensionnée doit être désaturée en prenant la moyenne des composantes rouge, verte et bleue de la couleur et en définissant chaque composante sur cette moyenne.
Un caractère doit être émis pour chaque bloc de pixels 2x2, en suivant les règles ci-dessous:
- Soit
e = 3 - floor[color/64]
, où la couleur fait référence à la composante rouge de la couleur du pixel supérieur gauche (dans la plage 0..255). Laissezf
,g
et seh
référer à cette valeur, mais pour en haut à droite, en bas à gauche, et les pixels en bas à droite respectivement. - Laissez
z
la moyennee
,f
,g
,h
. - Sortez le caractère correspondant à ce qui suit (le blanc représente un pixel où
3 - floor[color/64]
est zéro et le gris représente non nul). - = Afficher un espace (
)
- ou = sortie
"
sie (or f) >= 2
et'
sinon. - ou = sortie
,
sig (or h) >= 2
et.
sinon. - ou = Sortie
-
- ou = Sortie
;
- = Sortie
\
- = Sortie
/
- = Sortie
J
- = Sortie
L
- = Sortie
7
- = Sortie
P
-
z = 1
: sortie*
.z = 2
: sortieC
.z = 3
: sortie#
.
- Soit
Autres notes: Toutes les moyennes prises dans les étapes ci-dessus doivent utiliser une division entière (c'est-à-dire un arrondi vers 0).
Vous pouvez utiliser une bibliothèque pour lire les images, mais les bibliothèques ne peuvent pas être utilisées pour les étapes de redimensionnement et de désaturation.
Contribution
Votre programme comprendra trois données:
- Une image. Cette image peut être dans n'importe quel format de votre choix (par exemple PNG, PPM)
- La largeur de l'art ascii (en nombre de caractères)
- La hauteur de l'art ascii (en nombre de caractères)
L'entrée peut être lue via STDIN, passée sous forme d'argument de ligne de commande, stockée sous forme de variable, etc.
Production
Votre programme affichera l'art ascii généré à partir de l'image et à travers le processus décrit ci-dessus. Chaque ligne doit avoir la même largeur (la largeur passée en entrée), et aucun espace supplémentaire ne peut être ajouté ou supprimé. La dernière ligne peut avoir une nouvelle ligne de fin, mais ce n'est pas obligatoire. Les lignes vides (lignes avec uniquement des espaces) ne doivent pas être omises.
Exemples
Toutes les images ont été extraites de Wikipedia et publiées dans le domaine public. Votre programme devrait fonctionner pour toutes les images et entrées valides.
Largeur = 52, hauteur = 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' '---' --- '
Largeur: 70, Hauteur: 3:
---------------------------. .---------------- J ***************************** P -J ***************** *** / J **; ---------- ********* P --------- '-------------------- - «
Largeur: 50, Hauteur: 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 *** - «------»
Largeur: 26, Hauteur: 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» - «---
C'est le code-golf , donc la réponse la plus courte l'emporte.