Écrivez un programme ou une fonction qui prend un entier positif N et recrée ce motif de cercles mis à l'échelle pour s'adapter à une image de pixels N × N:
Cette image est un exemple de sortie valide pour N = 946.
Dans le cas où ce n'est pas clair, tous les petits cercles bleu clair ont le même rayon et sont positionnés dans les quatre cercles bleu foncé de la même manière. Les cercles bleu foncé ont le double de ce rayon et sont positionnés de manière similaire dans le grand cercle bleu clair.
Deux couleurs visuellement distinctes peuvent être utilisées à la place des deux nuances de bleu.
Le carré de fond doit être coloré.
L'anticrénelage est facultatif.
Enregistrez l'image dans un fichier, affichez-la ou dirigez les données d'image brutes vers stdout.
Tout format de fichier d'image courant est autorisé.
Le code le plus court en octets gagne.
Brownie pointe si vous étendez les aspects récursifs de ce motif de cercle à d'autres niveaux. (Gardez cela distinct de votre défi.)
la source
Réponses:
CJam, 83 octets
Essayez-le en ligne
CJam n'a pas de fonctionnalité de sortie d'image dédiée. Mon code génère une image en PBM ASCII. Pour la publication, j'ai converti cette image en PNG à l'aide de GIMP.
Notez qu'aucune fonctionnalité de dessin de cercle, ou quelque chose comme ça, il a utilisé. L'image est calculée pixel par pixel.
Des degrés plus élevés de la subdivision peuvent facilement être créés en augmentant la constante
3
autour du milieu du code.Les images de degré 4 et 5 ressemblent à ceci:
La séquence globale du code est la suivante:
Explication:
la source
Python 2 + PIL, 262 octets
Cette approche détermine la couleur de chaque coordonnée de pixel individuelle à l'aide de la fonction récursive
c
.c(x,y,0)
rend un cercle;c(x,y,1)
rend un cercle avec quatre cercles découpés;c(x,y,2)
rend l'image dans l'OP. Tout ce qui dépasse 2 me rapporte des points brownie.Version non golfée:
Image extra-récursive bonus:
la source
.save("p.png")
simplement utiliser.show()
PostScript, 335 octets.
PostScript n'est pas seulement un format de fichier graphique avec des capacités vectorielles et bitmap, c'est en fait un langage de programmation Turing-complet basé sur des objets. Le code ci-dessus est une implémentation de fonction récursive assez simple. Tous les opérateurs PostScript sont des fonctions, et il est courant de les redéfinir pour condenser le code. Notez que PostScript utilise la notation polonaise inversée (aussi appelée notation postfixée).
Les interprètes PostScript lisent généralement les métadonnées (comme la taille de la page et le titre) des commentaires spéciaux au début du fichier; de toute évidence, j'ai supprimé tout sauf le commentaire
%!
de signature PostScript essentiel de mon entrée, mais il devrait toujours s'afficher correctement dans tout interpréteur PostScript standard, par exemple GhostScript ou Okular. Il peut également être affiché à l'aide de l' utilitaire d' affichage fourni avec ImageMagick / GraphicsMagick.Notez que le fichier doit se terminer par un retour à la ligne (que j'ai inclus dans mon nombre d'octets), ou l'interpréteur peut se fâcher.
Le paramètre de taille
N
pour ce code est 512; il est divisé par 2 et dupliqué deux fois pour créer les paramètres de l'appel initial de la fonction récursivef
. La profondeur de récursivité est 2, qui est donnée juste avant l'f
entrée512 2 div dup dup 2 f
. Pour garder la taille petite, la sortie est en noir et blanc. Bien que vous puissiez définir une profondeur de récursion entière non négative raisonnable, cette version ne semble bonne qu'avec des profondeurs paires.Cette image est un graphique vectoriel, elle peut donc être affichée dans n'importe quelle résolution sans pixelisation, en fonction de la qualité et des paramètres de l'interpréteur / imprimante PostScript utilisé. (FWIW, PostScript utilise des courbes cubiques de Bézier pour dessiner des arcs circulaires, avec suffisamment de splines utilisées pour garantir que l'erreur est toujours inférieure à un pixel dans l'espace du périphérique). Pour le visualiser à l'aide de l' affichage ImageMagick de qualité raisonnablement élevée, vous pouvez faire:
les mêmes paramètres sont également bons si vous souhaitez utiliser ImageMagick
convert
pour le convertir dans un autre format. Par exemple, voici une version 640x640 du code PostScript ci-dessus converti en PNG:Voici une version légèrement plus grande qui gère les couleurs RVB et les profondeurs de récursivité impaires:
Il vous permet également de définir le paramètre de taille
N
et la profondeur de récursivitéd
près du haut du script.Enfin, voici la forme la plus lisible du code. (Malheureusement, la coloration syntaxique utilisée ici pour PostScript laisse beaucoup à désirer, mais je suppose que c'est mieux que rien ...). Les interprètes Smart PostScript liront la géométrie de la page à partir du
%%BoundingBox:
commentaire spécial.Et voici la profondeur == 4 sortie au format PNG, encore une fois créée en utilisant convert (et optimisée avec optipng ):
la source
Python 2 + PIL, 361 octets
Enregistre l'image en noir et blanc dans le fichier
c.png
:Je génère essentiellement l'un des demi-cercles de l'image
J
. Je m'utilise ensuite comme masque pour peindre la forme sur l'imageI
, qui a le cercle principal.Il pourrait être raccourci en utilisant
I.show()
à la fin à la place deI.save("c.png")
, mais je ne l'ai pas fait fonctionner sur Python 2. Si quelqu'un peut confirmer que cela fonctionne sur Python 2, je changerai cela.Le programme suivant génère l'image comme dans la question (419 octets):
la source
save
.SVG (1249 caractères)
Oui, beaucoup de personnages. Mais il est statique et s'affiche à n'importe quelle taille, ce qui lui donne un bonus.
Extrait visible:
la source
0
des constantes à virgule flottante? Par exemple, remplacez0.4
par.4
? Dans la plupart des langues, c'est valable. Et un aperçu très rapide de la spécification SVG suggère qu'elle devrait probablement fonctionner également.Mathematica
336359 octetsLes principaux objets graphiques sont des régions définies par des combinaisons logiques d'équations.
la source
Java, 550
Essentiellement juste pour expérimenter avec JavaFX.
Capture d'écran:
Pour les points brownie, remplacez le
2
dans le code (d(n,2,0,0)
) par un nombre différent.Ancienne version, 810
Il laisse des bords indésirables comme vous pouvez le voir sur cette capture d'écran .
la source
JavaScript (ES6), 279
Créez récursivement des toiles et ajoutez quatre fois le canevas enfant à son canevas parent. Au niveau inférieur, la toile est un seul cercle; ce canevas est tamponné quatre fois sur un canevas parent, puis ce canevas est tamponné quatre fois sur le canevas maître final.
Démo exécutable:
Afficher l'extrait de code
Avec des espaces, des commentaires et légèrement non golfés:
Cela peut facilement produire des couches de récursivité plus profondes en modifiant la valeur initiale
o-2
ou toute autreo-z
valeur plus grande.Notez que cette soumission ne s'exécutera que dans Firefox, en raison de l'utilisation des fonctionnalités ES6 et de l'incohérence dans l'API Canvas pour
fill
et lesclip
arguments.la source