Ce défi consiste à coder un interpréteur pour un langage de description de peinture Mondrian (MPDL).
Définition du langage
Le langage fonctionne sur une pile de rectangles. Un rectangle est défini par sa coordonnée supérieure gauche et sa coordonnée inférieure droite. Les coordonnées doivent être des entiers. La pile est initialisée avec un seul rectangle avec des attributs(1,1,254,254)
Chaque commande a le format suivant:
<character><integer>
Il existe trois commandes:
v<integer>
: effectuer un fractionnement vertical sur le dernier rectangle de la pile, à la position indiquée par le paramètre (en pourcentage). Le rectangle source est supprimé de la pile et remplacé par les deux nouveaux rectangles résultant du fractionnement. Le rectangle gauche est poussé sur la pile, puis le rectangle droit. Comme les coordonnées rectangulaires sont des entiers, les fractions doivent être arrondies au plus grand entier le plus petit.
h<integer>
: fente horizontale. Le rectangle supérieur est poussé sur la pile, puis le rectangle inférieur.
c<integer>
: supprime le dernier rectangle de la pile et le peint à la couleur donnée en paramètre. 1 = blanc, 2 = rouge, 3 = bleu, 4 = jaune
Défi
Écrivez un programme qui prend en paramètre une description de peinture et crée une représentation bitmap 256x256 des rectangles peints. Les rectangles doivent être séparés par une ligne noire de 3 pixels. Un rectangle d'un ou deux pixels doit avoir ses pixels non noirs masqués par les pixels noirs de bordure.
L'entrée peut être lue comme un paramètre ou comme un fichier, selon vous. Les commandes doivent être séparées par un espace. Vous pouvez supposer que le fichier d'entrée a une syntaxe correcte et n'a pas d'espaces de fin ou de début, des tabulations, etc. La sortie peut être directement affichée à l'écran, ou enregistrée dans un fichier, jusqu'à vous.
Le code le plus court gagne.
Tester
La source suivante:
v25 h71 v93 h50 c4 c1 c1 c2 h71 c3 h44 c1 c1
Devrait produire la composition II en rouge, bleu et jaune :
v
et lesh
arguments doivent être en pixelsv30 v50 c1 c5 h70 v50 c1 c3 c2
.Réponses:
Perl 5 + ImageMagick - 297
Quelque chose pour commencer:
Prend des entrées sur la ligne de commande et génère
a.gif
.la source
Haskell - 335
Le programme lit les instructions sur une seule ligne de stdin , si cela est inacceptable, faites-le moi savoir.
Compile dans un programme qui prend les drapeaux -w largeur -h hauteur -o fichier de sortie .Génère un fichier "a.svg", si ce n'est pas immédiatement clair dans le code. Étant donné que la sortie est une image vectorielle, elle n'est pas «pixel parfaite».C'est la première fois que je travaille avec Diagrams -package, n'hésitez pas à signaler toutes les erreurs que j'ai faites. Surtout n'importe quel backend qui me permettrait de produire avec moins de code serait bien.
Vous pouvez voir certaines des premières étapes que j'ai prises lors du développement du code dans http://paste.hskll.org/get/1737 . Il diffère du code ci-dessus dans les importations et manque de principal car le paste.hskll.org fournit son propre environnement principal et de dessin.
la source
Python -
434 405 377 364361Mon premier golf en python. Cela peut probablement être BEAUCOUP amélioré, donc toute rétroaction est appréciée.
la source
a+=[x]
au lieu dea.append(x)
. Et split n'a pas besoin d'argument s'il est séparé par des espaces.HTML + JavaScript ES6 (407)
Testé avec Firefox 32.0.3
la source
x.charAt(0)
->x[0]
;x.substr
->x.slice
;white yellow
->#fff #ff0
;document.getElementById("c")
->c
... et plusHTML + JavaScript (ES6) 335
Trop similaire à la réponse @mika - marquage CW.
la source