Écrivez un programme ou une fonction qui accepte l'entrée suivante dans un format raisonnable de votre choix:
Deux entiers positifs W et H qui définissent la largeur et la hauteur de l'image que vous allez générer.
Deux couleurs RVB C1 et C2 qui seront utilisées pour colorer l'image.
Une liste de 3 tuples de la forme
(r, x, y)
qui définissent des cercles avec un rayonr
et un centrex, y
dans le plan de l'image.r
est un entier positif etx
ety
sont des entiers quelconques. Le pixel supérieur gauche de l'image est0, 0
et l'axe des x augmente vers la droite et l'axe des y augmente vers le bas.
Générez une image aux dimensions W par H colorée avec C1 et C2 de telle sorte qu'il n'y ait pas deux régions voisines définies par tous les cercles qui se chevauchent ont la même couleur.
Par exemple: si l'entrée est
W = 300 H = 200 C1 = (255, 200, 0) C2 = (128, 0, 255) Circles = (25, 50, 80), (40, 80, 120), (300, -100, 6), (17, 253, 162)
alors les limites du cercle ressemblent à ceci:
Il y a six régions distinctes et contiguës dans l'image créée par les cercles. Chaque région doit être colorée avec C1 (jaune) ou C2 (violet) de sorte qu'il n'y ait pas deux régions voisines de la même couleur.
Il y a deux façons de procéder, leur seule différence étant que les couleurs sont permutées:
Ainsi, l'une ou l'autre de ces deux images serait une sortie valide pour l'exemple d'entrée.
Quelque chose comme ça serait une sortie non valide car deux régions jaunes se voisinent.
Vos images de sortie doivent suivre ces directives:
Outre C1 et C2, une troisième couleur neutre, comme le noir ou le blanc, peut être utilisée pour les limites des cercles tant qu'elles n'ont pas plus de 5 pixels d'épaisseur. (Des limites noires de 1 pixel d'épaisseur sont présentes dans l'exemple ci-dessus.)
Les limites des cercles ne sont cependant pas nécessaires. Les régions peuvent être voisines directement:
Ces deux éléments sont une autre sortie valide de l'exemple ci-dessus.
Les cercles doivent être aussi précis que possible, en utilisant des algorithmes de dessin de cercle ou tout ce que votre bibliothèque graphique fournit.
En général, la perfection des pixels n'est pas requise, mais si les paramètres d'entrée sont mis à l'échelle de plus en plus grands, l'image résultante devrait devenir de plus en plus précise.
L'anticrénelage est autorisé mais pas obligatoire.
Les lignes de quadrillage ou les étiquettes d'axe, etc. en arrière-plan ne sont pas autorisées.
Le code le plus court en octets gagne.
Plus d'exemples
Tous utilisant ces entrées avec différents ensembles de cercles:
W = 100
H = 60
C1 = (255, 0, 0)
C2 = (0, 0, 255)
Dans tous les exemples, les couleurs peuvent être échangées et restent valides.
Circles =
A. empty list
B. (13, 16, 20)
C. (30, 16, 20)
D. (200, 16, 20)
E. (42, 50, 20)
F. (42, 50, 20), (17, 40, 30)
G. (42, 50, 20), (17, 20, 30)
H. (42, 50, 20), (17, 10, 30), (10, 50, 30)
I. (42, 50, 20), (17, 10, 30), (35, 50, 20)
J. (18, 36, 40), (18, 63, 40), (18, 50, 20)
K. (100, -10, -20), (60, 50, -10)
L. (18, 36, 40), (18, 63, 40), (18, 50, 20), (14, 50, 20), (5, 50, 18), (20, 0, 0), (70, 22, 0), (10000, -9970, 0), (135, 100, -80)
A.
B.
C.
D.
E.
F.
G.
H.
I.
J.
K.
L.
Assurez-vous que votre sortie se comporte de la même manière que tous ces exemples.
la source
tikz
Réponses:
Mathematica, 165 octets
Fonction pure prenant quatre arguments: la largeur, la hauteur (les deux entiers), une paire ordonnée de triplets de nombres entre 0 et 1 (représentant les deux couleurs RVB), et une liste d'éléments du formulaire
{r, {x, y}}
pour enregistrer les rayons et les centres de les cercles. Par exemple, le premier exemple de l'OP serait appelé avec les arguments[300, 200, {{1, 0.784, 0}, {0.5, 0, 1}}, {{25, {50, 80}}, {40, {80, 120}}, {300, {-100, 6}}, {17, {253, 162}}}]
. L'axe y positif pointe vers le haut dans Mathematica.Norm[{x,y}-#2]<#
détecte si un point se trouve à l'intérieur d'un cercle donné;Boole[...]Pi
convertit celaTrue
ouFalse
enπ
ou0
. Après avoir calculé ces πs / 0 sur tous les cercles d'entrée, lesTr
additionne etCos
convertit les multiples pairs de π en 1, les multiples impairs de π en –1.ContourPlot[...,Contours->{0}]
colore ensuite la région appropriée du plan en deux couleurs selon que la valeur est supérieure ou inférieure à0
.AspectRatio->Automatic
fait ressembler les cercles aux cercles;PlotPoints->5!
donne une précision décente (augmentez-la9!
si vous voulez vraiment une image incroyable, loin dans le futur!);Frame->False
se débarrasse des axes; etContourShading->RGBColor@@@#3
utilise les couleurs d'entrée pour les contours.Exemple de sortie, avec la première paire de couleurs (car elles sont belles) mais la dernière série de cercles:
la source
JavaScript / SVG / HTML5, 219 octets
la source
BBC Basic,
120117 octetsTéléchargez l'interprète sur http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
BBC Basic dispose d'une gamme de modes de couleur vous permettant de tracer des graphiques raster en fonction des opérations logiques de base: OR, AND, XOR etc.
Il prend également en charge la reprogrammation des palettes, ce qui signifie que, par exemple, ici, une image à 2 couleurs peut avoir ses couleurs reprogrammées à n'importe laquelle des 4096 couleurs. L'implémentation utilisée ici présente quelques différences (non documentées) par rapport à l'implémentation BBC d'origine, dans laquelle les opérateurs EOR ne seraient pas nécessaires.
Non golfé
Écran de sortie typique
Exemple d'image agrandie par un facteur de 10 en unités / facteur de 5 en pixels (BBC basic utilise 1 pixel = 2 unités.)
la source
MATL ,
302925 octetsFormat d'entrée:
Essayez MATL en ligne! Ou vérifiez le dernier cas de test . (L'interpréteur est encore expérimental. Vous devrez peut-être actualiser la page et réessayer si cela ne fonctionne pas).
Explication
Le code utilise des nombres complexes pour définir la grille de points et pour calculer les distances, et fait un usage intensif des opérations de tableau avec la diffusion .
la source
Python utilisant pypng ,
140138 octetsExemple d'utilisation:
Merci à xnor pour avoir économisé 2 octets.
la source
abs(x-X+1j*(y-Y))<r
.Math (non compétitif)
(idk comment faire LaTeX dans PPCG, donc j'ai utilisé un outil LaTeX to png)
Explication
Le produit de plusieurs équations circulaires (
(x-a)^2+(y-b)^2-r^2
)> = 0 fera un graphique dont cette question a besoin. Dans l'équation,n
est la taille du tableau et(x, y or r)_k
est lek
e(x, y, or r)
élément.Exemple
(0,0,2),(2,2,2)
(Graphique d'inégalité par WolframAlpha)
Équation Get / Run pour WolframAlpha
Afficher l'extrait de code
Maintenant, faites-le fonctionner avec Mathematica ...
la source
Python 2.x,
166158La fonction génère un fichier PPM sur la sortie standard.
Exemple:
la source
Lisp commun + Quicklisp + ZPNG 260 + 20 = 280 caractères
C'est le code le plus large que j'ai jamais écrit en CL, et si je ne faisais pas de golf de code, j'aurais restructuré cela pour le rendre beaucoup plus facile à lire ...
Prélude (20 caractères)
Golfé (260 caractères)
Non golfé:
(Utilise defun pour permettre des tests et des noms de variable plus longs pour la lisibilité)
Exemple d'utilisation:
Explication
Renvoie vrai si le point (i, j) se situe dans le cercle donné circ. La distance euclidienne est calculée en prenant la valeur absolue du nombre complexe qui représente le vecteur de (i, j) au centre de circ.
Mappez cette fonction sur la liste des cercles et vérifiez si le point donné (i, j) se situe dans un nombre pair de cercles.
Sélectionnez la couleur en fonction de ce test.
Rassemblez une liste plate de tous les octets RVB en bouclant sur chacun (i, j) de l'image et en ajoutant les listes résultantes ensemble.
Convertissez cette liste d'octets en un tableau d'octets approprié, afin que zpng puisse l'intégrer correctement.
Créez l'objet png.
Créez la fonction pour prendre la largeur, la hauteur, deux couleurs et la liste des cercles et renvoyer l'objet png créé.
la source
JavaScript (ES6), 224 octets
J'ai vu la solution JS + SVG, mais je devais juste créer une solution basée sur le canevas ;-) Il s'agit d'une fonction qui renvoie un élément de canevas. Si un élément de canevas existant peut être fourni, supprimez 40 octets.
Appelez comme
f(width, height, [[r1, g1, b1], [r2, g2, b2]], [[r1, x1, y1], [r2, x2, y2], ...])
Exemple de sortie:
la source
Löve2D , 353 octets.
la source