Dessiner la courbe de pointe de flèche de Sierpinski


14

introduction

La courbe de pointe de flèche de Sierpinski est une courbe dont la limite est le triangle de Sierpinski.

Cela commence d'abord comme ceci:

 _
/ \

Ensuite, chaque ligne est remplacée par une version pivotée de la première:

  _
 / \
 \ /
_/ \_

Prochain:

     _
    / \
    \ /
   _/ \_
  /     \
  \_   _/
 _  \ /  _
/ \_/ \_/ \

Sierpinski Arrowhead Curve Evolution

Ta tâche

Étant donné un nombre n , sortez la n -ième itération de la courbe de pointe de flèche de Sierpinski.

Vous pouvez choisir d'index 0 ou 1, mais veuillez préciser dans votre réponse.

Vous pouvez générer une image ou utiliser Ascii Art dans le format que j'ai ci-dessus.

Vous ne pouvez pas utiliser de fonctions intégrées pour générer cette courbe.

N'oubliez pas qu'il s'agit de , donc le code avec le moins d'octets gagne.

Réponses:


14

Octave, 240 236 221 octets

Ceci est fait avec la même idée utilisée ici, mais j'ai dû la changer pour l'adapter à la courbe de la pointe de flèche sierpinsky.

m=input(0);g=2*pi/6;u=cos(g);v=sin(g);A=[1,0];B=[u,v];C=[-u,v];D=-A;E=-B;F=-C;for k=1:m;f=[E;F;A];b=[A;B;C];A=[B;A;F];d=[C;D;E];C=[D;C;B];E=[F;E;D];B=b;D=d;F=f;end;A=[0,0;cumsum(A)];plot(A(:,1),A(:,2));axis off;axis equal

entrez la description de l'image ici


u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;est 16 octets plus court :) Vous pouvez également faire axis off equalpour enregistrer 5 autres octets.
Stewie Griffin

3

Haskell + diagrammes, 176 octets

import Diagrams.Prelude
import Diagrams.Backend.SVG
g n=renderSVG"a"(mkWidth 99).strokeT.a n
a 0=hrule 1
a n|b<-a(n-1)=b%6<>b<>b%(-6);a%n=rotateBy(1/n).reflectY$a::Trail V2 Double

Crée un fichier svg avec un fond transparent appelé "a".

g 0sort une ligne horizontale, g 1est /¯\.

entrez la description de l'image ici


Génial, je ne savais rien Diagrams!
flawr

@flawr, c'est génial mais les mises en garde habituelles du programme graphique Haskell s'appliquent. Ce serait bien d'appeler simplement l'équivalent de plot() pour ouvrir une fenêtre.
Angs

2

MSWLogo (version 6.5b), 102 octets

Prend les deux fonctions shapeL, shapeRdonnées ici et les fusionne en ajoutant un argument supplémentaire :a, qui appelle la fonction opposée lorsqu'elle est annulée.

to s :n :a :l
if :n=0[fd :l stop]
rt :a
s :n-1(-:a):l
lt :a
s :n-1 :a :l
lt :a
s :n-1(-:a):l
rt :a
end

Une fonction sest définie, qui prend le nombre d'itérations :n(basé sur 1), l'angle :a, la longueur :l. Il est récursif, appelant une itération inférieure de lui-même avec l'angle :aannulé dans deux cas pour obtenir l'orientation correcte.

  • rt :a, lt :a tournez la tortue (triangle truc dont le chemin est tracé) à droite, à gauche par :adegrés.
  • fd :lfait avancer la tortue par :létapes.

La fonction doit être appelée avec une valeur :aégale à 60.

Pointes de flèches

Ici, repeatc'est essentiellement une boucle FOR, avec compteur intégré repcount. puet pdsignifient "stylo vers le haut" et "stylo vers le bas", qui empêchent la tortue de dessiner pendant que sa position est définie à l'aide desetxy .

Les dessins de chaque itération ont été appelés avec une longueur :légale à power 2 (7-repcount), ce qui diminue de façon exponentielle; c'est parce que la définition utilise la même chose :ldans l'étape récursive, donc avec fixe :lla taille globale de la sortie augmentera de façon exponentielle avec :n.


C'est la bonne langue pour le travail, mais techniquement les réponses ne sont pas autorisées à fournir des données supplémentaires, donc idéalement, vous encoderiez les 60 dans votre réponse.
Neil

@Neil Donc, je viens d'inclure 60dans le nombre d'octets?
u54112

Je ne suis pas sûr que ce soit aussi simple, mais je ne connais pas la langue moi-même.
Neil

1

Python 2, 124 octets

Basé sur le code de l'article Wikipedia.

from turtle import*
def c(o,a):
 if o:o-=1;c(o,-a);lt(a);c(o,a);lt(a);c(o,-a)
 else:fd(9)
n=input()
if n%2==0:lt(60)
c(n,60)

L'ordre 0 est une ligne droite.


Vous devez modifier votre code pour utiliser un angle de 60 degrés, sinon il ne se rapprochera pas du triangle Sierpinsky. De plus, l'orientation change en fonction de l'ordre, ce qui ne me semble pas correct. trinket.io/python/a803546939
mbomb007

La réponse du logo donne également une fonction qui prend l'angle comme paramètre, donc je pense que c'est OK. En ce qui concerne l'orientation, c'est toujours la même courbe, juste tournée.
BookOwl

Cependant, la réponse du logo est toujours la même rotation. La vôtre est une rotation différente pour chaque commande, et ils ne sont pas tous les mêmes. Ce n'est pas bien. Regardez les photos que contient la question.
mbomb007

Où le défi dit-il que les rotations doivent être les mêmes?
BookOwl

1
Toute majeure en mathématiques peut vous dire qu'une limite doit converger. Pas le vôtre.
mbomb007

1

Langage Mathematica / Wolfram 73 octets

s=1;Region@Line@AnglePath[Nest[Join@@({#,s=-s,s}&/@#)&,{#~Mod~2},#]Pi/3]&

Explication simple:
AnglePath [{θ1, θ2, θ3,…}] donne la liste des coordonnées 2D correspondant à un chemin qui commence à {0,0}, puis prend une série de pas de longueur unitaire aux angles relatifs successifs θi.

n = 1

Graphics@Line@AnglePath[60°{1,-1,-1}]

n = 2

Graphics@Line@AnglePath[60°{0,1,1, -1,-1,-1, -1,1,1}]

n = 3

Graphics@Line@AnglePath[60°{1,-1,-1, 1,1,1, 1,-1,-1, -1,1,1, -1,-1,-1, -1,1,1, -1,-1,-1, 1,1,1, 1,-1,-1}]

entrez la description de l'image ici entrez la description de l'image ici


0

Mathematica, 62 octets

Graphics@Line@AnglePath[Pi/3Nest[Flatten@{-#,1,#,1,-#}&,0,#]]&

Comment ça marche?
BookOwl

0

JavaScript (ES6), 180 octets

f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).map(s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l)).concat(f(n,d+1).map(s=>s+r(!(d%3))+a.shift(),a=f(n,d+2))):[`_/\\`[d%3]]
<input type=number min=1 oninput=o.textContent=f(this.value).join`\n`><pre id=o>

Renvoie un tableau de chaînes. Obtenir le bon espacement a été la partie la plus difficile! Version chaîne pure pour 205 octets:

f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).replace(/.+/g,s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l))+`\n`+f(n,d+1).replace(/.+/g,s=>s+r(!(d%3))+a.shift(),a=f(n,d+2).split`\n`):`_/\\`[d%3]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.