Le triangle de Sierpinsky est une fractale créée en prenant un triangle, en diminuant la hauteur et la largeur de 1/2, créant ainsi 3 copies du triangle obtenu et en les plaçant de telle sorte que chaque triangle touche les deux autres sur un coin. Ce processus est répété maintes et maintes fois avec les triangles obtenus pour produire le triangle de Sierpinski, comme illustré ci-dessous.
Ecrivez un programme pour générer un triangle de Sierpinski. Vous pouvez utiliser n'importe quelle méthode pour générer le motif, en dessinant les triangles réels ou en utilisant un algorithme aléatoire pour générer l'image. Vous pouvez dessiner en pixels, en art ascii ou à votre guise, à condition que le résultat soit similaire à la dernière image ci-dessus. Le moins de personnages gagne.
Réponses:
HTML + JavaScript, 150 caractères (voir notes pour 126 caractères)
Espace blanc inséré pour la lisibilité et non compté.
L’essentiel est d’appliquer la règle de coloration des pixels pour laquelle
x & y == 0
le conditionnelx&y||
produit un «triangle rectangle de Sierpinski»; etx-~y/2,k-y
sont une transformation de coordonnées pour produire l'affichage approximativement équilatéral.Une version moins correcte (en HTML) contient 126 caractères:
(La façon dont ceci est moins correct est qu’il omet l’
title
élément et la balise de fin de l’canvas
élément, qui sont tous deux nécessaires pour un document correct, même si leur omission ne modifie pas l’ interprétation du document.)Trois personnages peuvent être sauvegardés en éliminant
k
en faveur de la constante64
, au prix d'un résultat plus petit; Je ne compterais pas l'8
option car elle n'a pas suffisamment de détails.Notez qu'une taille égale ou supérieure à 256 requiert des attributs
<canvas>
pour augmenter la taille de la zone de travail par défaut.la source
<canvas id=c>
et ensuitec.getContext
. Raccourcir les boucles:for(x=k=128;x--;)for(y=k;y--;)
x&y?0:
peut être remplacée par lax&y||
solution sinon agréable.GolfScript (
4342 caractères)Sortie:
Changez le "3" en un nombre plus grand pour un triangle plus grand.
la source
Python (234)
Golf maximale, petite image:
Nécessite
python3-cairo
.Pour obtenir une belle image de grande taille, il me fallait 239 caractères.
la source
import cairo as c
vous sauver quelques caractèresMathematica - 32 caractères
Mathematica - 37 caractères
Cela produira un tableau 2D de 0 et 1, où 1 dessine le triangle de Sierpinski.
la source
ArrayPlot@CellularAutomaton[90, {{1}, 0}, 31]
ouMatrixPlot@CellularAutomaton[90, {{1}, 0}, 31]
.ReliefPlot@
...Python,
10186Utilise la règle 90 automate.
C'est plus long, mais plus joli.
Edit: jouer directement avec les cordes, se débarrasser des tranchants excessivement longs, rendre la sortie plus jolie.
Sortie:
la source
J
Pas idéal, car le triangle est déséquilibré et suivi par beaucoup d’espaces blancs - mais intéressant néanmoins, j’ai pensé.
Sortie:
Une explication rapide:
Le verbe
(,~,.~)
est ce qui fait le travail ici. C'est un crochet qui coud,.
l'argument lui-même (o
->oo
), puis ajoute l'argument d'origine à la sortie:devient
Ce verbe est répété 6 fois,
^:6
la sortie de chaque itération devenant l’entrée de la prochaine itération. Alorsdevient
qui devient à son tour
etc. J'ai ensuite utilisé l'adverbe oblique sur append
,/.
pour lire les lignes en diagonale afin de redresser (ish) le triangle. Je n'avais pas besoin de faire cela, comme le souligne randomra . J'aurais pu inverser|.
le lot pour obtenir le même résultat. Mieux encore, j'aurais peut-être utilisé(,,.~)^:6,'o'
pour sauvegarder complètement le pas inverse.Eh bien, vous vivez et apprenez. :-)
la source
|.(,~,.~)^:6,'o'
est plus court et sans espaces supplémentaires. Et(,~,.~)^:6,1
donne également une entrée décente en seulement 12 caractères!APL (51)
Explication:
A←67⍴0
: A est un vecteur de 67 zérosA[34]←1
: le 34ème élément est 1{...}A
: en commençant par A, faites:~⊃⍵:
: si le premier élément de la ligne en cours est zéro⍵,∇
: ajoute la ligne en cours à la réponse et recurse avec:(1⌽⍵)≠¯1⌽⍵
: le vecteur où chaque élément est le XOR de ses voisins de la génération précédente⋄⍬
: sinon, nous avons terminé32 67⍴
: formatez ceci dans une matrice 67x321+
: ajouter un pour sélectionner la bonne valeur dans le tableau de caractères' ○'[
...]
: affiche soit un espace (ne fait pas partie du triangle), soit un cercle (quand il fait partie du triangle)Sortie:
la source
Haskell (291)
Je ne suis pas très bon au golf avec les codes haskell.
La sortie de
solve 4
est:la source
QBasic 151 caractères
Par exemple, voici comment cela peut être fait dans QBasic.
la source
Python (42)
Au départ, je voulais poster quelques suggestions sur la solution de boothbys (qui utilise en fait la règle 18 :), mais je n’avais pas assez de réputation pour commenter, j’en ai donc fait une autre réponse. Depuis qu'il a changé son approche, j'ai ajouté une explication. Mes suggestions auraient été:
qui aurait conduit au code suivant (93 caractères):
Mais j’optimisais encore, d’abord en utilisant un entier long au lieu d’un tableau entier et en imprimant simplement la représentation binaire (75 caractères):
Et enfin en imprimant la représentation octale, qui est déjà supportée par l’interpolation printf (42 caractères):
Tous vont imprimer:
Bien sûr, il existe aussi une solution graphique (131 caractères):
:RÉ
la source
x=8**31;exec"print'%o'%x;x^=x/8;"*32
8086 Code machine - 30 octets.
NOTE: Ce n'est pas mon code et ne devrait pas être accepté comme une réponse . J'ai trouvé cela tout en travaillant sur un problème CG différent d'émuler un processeur 8086 . Le fichier texte inclus reconnaît David Stafford , mais c’est le meilleur que je puisse trouver.
Je poste ceci parce que c'est intelligent, bref, et je pensais que vous voudriez le voir.
Il utilise des opcodes qui se chevauchent pour regrouper plus d'instructions dans un espace plus petit. Étonnamment intelligent. Voici le code machine:
Un décodage simple ressemble à ceci:
Lorsqu'il est exécuté, lorsque le saut à 0x0115 se produit, notez qu'il revient à 0x010C, au beau milieu d'une instruction précédente:
Brillant! J'espère que ça ne vous dérange pas que je partage ça. Je sais que ce n'est pas une réponse en soi, mais cela présente un intérêt pour le défi.
Ici c'est en action:
la source
C
12711911610865Celui-ci utilise l’astuce de la réponse HTML pour l’
^ i & j
obtenir pour imprimer une jolie sortie nécessiterait 1 caractère supplémentaire (vous pouvez obtenir une sortie vraiment moche en sacrifiant lea^
).Pour le rendre joli tour
(32^i&j)
à(32|!(i&j))
tour et tournez++i<a
à++i<=a
. Cependant, perdre du caractère sur des regards me semble ungolfish.Sortie laide:
En fait, j'aime bien à quoi ça ressemble. Mais si vous insistez pour que ce soit joli, vous pouvez amarrer quatre personnages. Jolie sortie:
Laissant l'ancienne version de l'automate cellulaire à 108 caractères.
Donc, je ne pense pas que je vais le raccourcir beaucoup, alors je vais expliquer le code.Je vais laisser cette explication, car certaines astuces pourraient être utiles.Quelques sorties
la source
Code 80x86 / MsDos - 10 octets
En tant que sizecoder spécialisé dans les très petites introductions sur MsDos, j'ai réussi à créer un programme qui n'occupe que 10 octets.
en hex:
en asm:
La première version que j'ai codée était "Colpinski", dont la taille est de 16 octets. Elle est même interactive et vous permet de changer la couleur avec le clavier et la souris. Avec "Frag" - un autre code de taille -, nous l'avons réduit à 13 octets, permettant ainsi un programme de 10 octets contenant uniquement la routine de base.
Cela devient un peu plus intéressant quand les choses s'animent, alors je mentionnerai une autre version, Zoompinski 64 - essayant d'imiter le comportement exact de "Zoompinski C64" sur 512 octets - également pour MsDos, taille de 64 octets comme son nom l'indique.
Il est possible d’optimiser cet objet jusqu’à 31 octets, tout en perdant élégance, couleurs et symétrie (source et fichier exécutable disponibles derrière le lien ci-dessus).
Téléchargez l'original et commentez "Pouet"
la source
PostScript, 120 caractères
Sortie Ghostscript:
Ceci dessine la figure en triplant récursivement ce qui est déjà dessiné.
La première étape consiste à tracer une ligne. La ligne est enregistrée en tant que chemin utilisateur, puis le chemin utilisateur est ajouté deux fois après une rotation de 120 degrés à chaque fois.
[2 0 0 2 7 4]concat
déplace le "point de rotation" vers le centre du prochain grand "triangle central" blanc qui doit être entouré par des réplications du triangle que nous avons déjà. Nous revenons ici à l’étape 1 (création d’une trajectoire ascendante triplée par rotation).Le nombre d'itérations est contrôlé par le premier nombre de la ligne 3.
la source
J (9 caractères)
Facilement le plus moche, vous devez vraiment plisser les yeux pour voir la sortie;)
produit la sortie
bien sûr, vous pouvez l'afficher graphiquement:
la source
APL,
3732 (2823)Triangle vertical (
37 caractères32 caractères)Explication
1 2⍴'/\'
: Créer une matrice de caractères 1 × 2/\
{((-1⌷⍴⍵)⌽⍵,∊⍵)⍪⍵,⍵}
: Une fonction qui compresse le bon argument des deux côtés avec des blancs pour créer une matrice double la plus large, puis lamine le bon argument lui-même doublé sur le fond.Par exemple
/\
deviendrait⍣⎕
: Répéter la fonction (entrée utilisateur) fois.Exemple de sortie
Triangle asymétrique (
2823 caractères)Explication
1 1⍴'○'
: Créer une matrice de caractères 1 × 1○
{(⍵,∊⍵)⍪⍵,⍵}
: Une fonction qui compresse le bon argument à droite avec des blancs pour créer une matrice double la plus large, puis lamine le bon argument lui-même doublé sur le bas.Par exemple
○
deviendrait⍣⎕
: Répéter la fonction (entrée utilisateur) fois.Exemple de sortie
la source
Python (75)
J'ai deux ans de retard à la fête, mais je suis surpris que personne n'ait encore adopté cette approche
Utilise le produit Kronecker pour remplacer une matrice par plusieurs copies de celle-ci.
Je pourrais économiser deux caractères en utilisant la
x=kron(x,x);x=kron(x,x)
ligne trois pour obtenir une image de 16 x 16 pixels avec trois niveaux visibles ou ajouter un autre caractère à l'itérateur pour obtenir une image de 2 ^ 16 x 2 ^ 16 = 4,3 gigapixels et 15 niveaux de triangle.la source
Logo, 75 caractères
59 caractères pour seulement la première fonction, la seconde appelle la première avec la taille et la profondeur / le nombre d'itérations. Vous pouvez donc appeler la première fonction de l'interpréteur avec la commande: e 99 5, ou quelle que soit la taille que vous souhaitez afficher.
la source
to f
etend
autoure 99 5
, vous avez un programme complet exécutable en moins de caractères. En outre, dans UCBLogo (bien que pas d'autres versions), vous pouvez perdre les deux-points sur les variables pour enregistrer davantage de caractères.matlab 56
la source
J (18 caractères)
Résultat
la source
Python (90 caractères)
Essayez-le en ligne
Tracez une ligne fractale remplissant le triangle de Sierpinsky
la source
ht();speed(0);up();goto(20-window_width()/2, 20-window_height()/2);down()
après l'importation. Cela l'exécutera beaucoup plus rapidement et garantira que la sortie s'adapte à la toile.Mathematica 67
Mathematica 92
la source
Mathematica , 29 octets
Le tétraèdre de Sierpinski peut être dessiné de la même manière:
la source
J ,
3735 octets-2 octets grâce à FrownyFrog
Essayez-le en ligne!
Ceci est la version d'art ascii de Peter Taylor convertie en J. Pourrait économiser des octets avec une version moins jolie, mais pourquoi?
la source
@]^:[
->@[&0
et' /\ '
->' /\'
&0
astuce est documentée?,~
.Lua script en Golly , 54 octets
Golly est un simulateur d'automate cellulaire prenant en charge les scripts Lua et Python.
Ce script définit la règle sur Wolfram Rule 60, définit la cellule sur (0,0) sur 1 et exécute 512 étapes.
la source
Postscript,
205203La réécriture à l'aide de chaînes et la récursivité aboutit exactement au même compte. Mais les limitations de profondeur de la macro-approche sont dépassées.
Edit:
fill
est plus court questroke
.Mis en retrait et commenté.
Ajouter
0 setlinewidth
donne une meilleure impression de la profondeur de celle-ci.la source
APL (Dyalog Classic) , 12 octets
Essayez-le en ligne!
la source
Asymptote, 152 octets
J'ajouterai ceci, la plupart du temps depuis que je n'ai pas vu plus ou moins de réponses en asymptote sur ce site. Quelques octets gaspillés pour un formatage agréable et une généralité, mais je peux vivre avec cela. Changer A, B et C changera l'endroit où se trouvent les coins du triangle conteneur, mais probablement pas comme vous le pensez. Augmentez le nombre d'inégalités pour augmenter la profondeur.
ou non-golf et lisible
Donc, asymptote est un langage graphique vectoriel soigné avec une syntaxe quelque peu similaire à celle du C. Très utile pour les diagrammes techniques. La sortie est bien sûr au format vectoriel par défaut (eps, pdf, svg) mais peut être convertie en pratiquement tout ce que supporte imagemagick. Sortie:
la source
Haskell ,
166154 octets(-12 octets grâce à Laikoni, (compréhension de zip et de liste au lieu de zipWith et lambda, meilleur moyen de générer la première ligne))
Essayez-le en ligne!
Explication:
La fonction
i#n
dessine un triangle ASCII de hauteur2^n
après desi
étapes d'itération.Le codage utilisé en interne code les positions vides en tant que
1
et les positions complètes en tant que0
. Par conséquent, la première ligne du triangle est codée comme[1,1,1..0..1,1,1]
avec des2^n-1
uns des deux côtés du zéro. Pour construire cette liste, nous commençons par la listex=1<$[2..2^n]
, c'est-à-dire la liste[2..2^n]
avec tout ce qui est mappé1
. Ensuite, nous construisons la liste complète en tant quex++0:x
L'opérateur
k!p
(explication détaillée ci-dessous), à partir d'un index de lignek
et d'un correspondant,p
génère une liste infinie de lignes qui suiventp
. Nous l'invoquons avec1
la ligne de départ décrite ci-dessus pour obtenir le triangle entier, puis prenons uniquement les premières2^n
lignes. Ensuite, nous imprimons simplement chaque ligne en remplaçant1
par espace et0
parM
(en accédant à la liste"M "
à l'emplacement0
ou1
).Opérateur
k!p
est défini comme suit:Premièrement, nous générons trois versions de
p
:1:p
qui estp
avec un1
préfixe,p
lui-même ettail p++[1]
qui est tout sauf le premier élément dep
, avec un1
ajouté. Nous zippons ensuite ces trois listes, nous donnant effectivement tous les éléments dep
leurs voisins gauche et droit, comme(l,m,r)
. Nous utilisons une liste de compréhension pour calculer ensuite la valeur correspondante dans la nouvelle ligne:Pour comprendre cette expression, nous devons comprendre qu'il existe deux cas fondamentaux à prendre en compte: soit nous élargissons simplement la ligne précédente, soit nous nous trouvons à un point où commence un point vide dans le triangle. Dans le premier cas, nous avons un point rempli si l’un des points du voisinage est rempli. Cela peut être calculé comme suit
m*l*r
: si l'un de ces trois est zéro, alors la nouvelle valeur est zéro. L'autre cas est un peu plus compliqué. Ici, nous avons essentiellement besoin d'une détection de bord. Le tableau suivant donne les huit quartiers possibles avec la valeur résultante dans la nouvelle ligne:Une formule simple pour obtenir ce tableau serait ce
1-m*r*(1-l)-m*l*(1-r)
qui simplifiem*(2*l*r-l-r)+1
. Nous devons maintenant choisir entre ces deux cas, c'est-à-dire où nous utilisons le numéro de lignek
. Simod k (2^(n-i)) == 0
, nous devons utiliser le second cas, sinon, nous utilisons le premier cas. Le terme0^(mod k(2^n-i))
est donc0
si nous devons utiliser le premier cas et1
si nous devons utiliser le second cas. En conséquence, nous pouvons utiliserau total - si nous utilisons le premier cas, nous obtenons simplement
m*l*r
, alors que dans le second cas, un terme supplémentaire est ajouté, donnant le grand total dem*(2*l*r-l-r)+1
.la source
C, 106 caractères
(Cela m'amuse toujours de dire que
puts("")
c'est le moyen le plus court de générer une nouvelle ligne en C.)Notez que vous pouvez créer des joints plus grands (ou plus petits) en remplaçant le test de
32
lafor
boucle par une puissance plus grande (plus petite) de deux, à condition de remplacer également le joint33
au milieuprintf()
par la puissance de deux plus. une.la source