Graphique des fleurons d'une fleur

31

Jetez un œil à cette fleur de camomille:

Joli, non? Et si je te disais que ce n'était pas vraiment une fleur?

Beaucoup de fleurs (y compris les tournesols, la camomille, les marguerites et autres) se composent en fait de très petites fleurs (les points noirs sur les tournesols) sur une tête de fleur. Ces fleurs miniatures sont appelées fleurons , et elles sont disposées de manière très spéciale.

Fondamentalement, la position du nième fleuron sur un capitule est (en coordonnées polaires):

où c = 1 (Notez que 137,508 degrés = angle d'or. Vous n'avez pas besoin d'utiliser cette précision exacte.)

Cela provoque la formation des fleurons dans une spirale appelée spirale de Fermat. Le positionnement des fleurons est également lié aux nombres de Fibonnaci, mais c'est un conte pour une autre fois.

Voici donc le défi. Étant donné un entier n en entrée, calculez les positions des n premiers fleurons et tracez-les . C'est , donc je veux vraiment que vous affichez les points dans une fenêtre quelconque ou sortis sous forme de données dans un format d'image commun vers STDOUT ou un fichier. En dehors de cela, ce défi devrait être assez simple. C'est le , donc le code le plus court gagne. GL HF!

Voici un exemple d'image de ce à quoi pourrait ressembler une sortie:

un spaghetto
la source
Sommes-nous autorisés à tirer la spirale à l'envers?
lirtosiast
1
FWIW de nombreux fruits affichent ce modèle, comme l'ananas, l'agauje et la pomme de pin. Cela ne devrait pas être surprenant car les fruits se développent à partir des fleurs. Fait intéressant, certains corps de cactus affichent également ce modèle. Mon préféré est le brocoli Romanesco fractal: en.wikipedia.org/wiki/Romanesco_broccoli#/media/…
user151841
1
C'est super! J'ai déjà vu du brocoli Romanesco; Je pense que c'est vraiment cool de voir comment ils ont ce modèle fractal. Peut-être que je pourrais faire un défi à ce sujet ...
un spaghetto

Réponses:

21

TI-BASIC, 34 octets

Pour la série de calculatrices TI-83 + / 84 +.

Input N
2πe^(-2sinh⁻¹(.5→θstep
AnsN→θmax
"√(θ→r₁
Polar                      ;Displays polar mode graphs to graph screen
Dot                        ;Prevents lines from connecting points
DispGraph                  ;Displays graph screen

Cela considère que le point à l'origine est le 0ème point.

Merci au sinh⁻¹(jeton d' un octet , 2πe^(-2sinh⁻¹(.5est un moyen rapide d'obtenir l'angle d'or en radians. Cela découle du fait que e^(sinh⁻¹(.5c'est le nombre d'or.

Voici des captures d'écran pour N = 50.

(Oui, c'est un écran monochrome 96x64 sur une TI-84 +. Les nouvelles calculatrices couleur ont une mise à niveau de la résolution, mais n'ont toujours que 3,7% des pixels d'un iPhone.)

Sans coordonnées affichées

Appuyez TRACEpour parcourir chaque point.

Avec coordonnées

lirtosiast
la source
5
TI-BASIC est un choix naturel pour les coordonnées polaires.
Conor O'Brien du
Comment avez-vous déterminé le nombre d'octets? On dirait beaucoup plus que 34. Une clé préprogrammée, comme cela sinh⁻¹semble être le cas (si j'ai bien compris votre explication), compterait pour plus d'un octet.
DavidC
@DavidCarraher TI-BASIC est symbolisé ; tous ces jetons ont chacun un octet dans la mémoire de la calculatrice.
lirtosiast
1
Vous pouvez déterminer le nombre d'octets dans un programme en allant dans Mem (2nd -> +) -> 7. Vous verrez alors une liste de tous les programmes sur votre calculatrice et le nombre d'octets qu'ils prennent. Notez que tous les programmes TI-BASIC ont un en-tête de 9 octets + le nombre d'octets dans le nom, assurez-vous donc de les soustraire pour obtenir le nombre d'octets approprié.
un spaghetto du
Erreur de syntaxe sur -2sinh ^ -1
username.ak
15

Python 2, 85 82 81 octets

from pylab import*
for i in arange(0,input(),2.39996):polar(i,sqrt(i),'o')
show()

Raccourci d'un octet par marinus.

Utilisation de l'angle d'or en radians. La longueur en octets est la même si j'utilise 137.508 à la place, mais en quelque sorte, ça n'a pas l'air aussi bien. Génère un tracé polaire à l'aide de pylab. Ci-dessous, lorsque 300 (pour l'ancienne version) est l'entrée et 7000 (pour la nouvelle version) est l'entrée. Pourrait arrondir l'angle jusqu'à 2,4 pour réduire le nombre d'octets à 77.

Version plus ancienne lorsque l'entrée est 300

Version plus récente lorsque l'entrée est 7000

Voici une version plus longue qui produit un look plus net en supprimant la grille et l'axe:

from pylab import *
def florets(n):
    for i in arange(0, n, 2.39996):polar(i, sqrt(i), 'o')
    grid(0)#turn off grid
    xticks([])#turn off angle axis
    yticks([])#turn off radius axis
    show()

La raison des différentes couleurs est que chaque point est tracé séparément et traité comme son propre ensemble de données. Si les angles et les rayons étaient transmis sous forme de listes, ils seraient traités comme un ensemble et seraient d'une seule couleur.

Statut
la source
1
Je pense que c'est de loin la plus jolie réponse. C'est très cool de voir les motifs en spirale clairs au centre.
El'endia Starman,
Vous pouvez enregistrer un octet en utilisant une forboucle normale au lieu d'une compréhension de liste. Il faudrait qu'il soit sur sa propre ligne, mais ;et \nsoit de la même longueur, donc cela n'a pas d'importance. C'est à dire: from pylab import*- for i in arange(0,input(),2.39996):polar(i,sqrt(i),'o')-show()
marinus
@marinus mais ce n'est plus une doublure super cool! Mais merci, je l'ai ajouté.
Status
14

Blitz 2D / 3D , 102 octets

(La toute première réponse Blitz 2D / 3D sur ce site!)

Graphics 180,180
Origin 90,90
n=Input()
For i=1To n
t#=i*137.508
r#=Sqr(t)
Plot r*Cos(t),r*Sin(t)
Next

Une entrée de 50remplit la fenêtre. (Oui, je pourrais raser deux octets en faisant Graphics 99,99, mais ce n'est pas aussi intéressant ou utile visuellement.)

50 fleurons

Version plus jolie (et quitte plus joliment):

Graphics 400,400
Origin 200,200

n=Input("How many florets? ")

For i = 1 To n
    t# = i * 137.508
    r# = Sqr(t)

    Oval r*Cos(t)-3,r*Sin(t)-3,7,7,1
Next

WaitKey
End

Exemple de 200 fleurons

El'endia Starman
la source
hé, bien! je ne connaissais pas le blitz avant de lire ceci.
Timothy Groote du
Wow, Blitz3D était ma première langue il y a environ 15 ans: D ... soupir ..: '(
noncom
Degrés par défaut? "Intéressant" ...
lirtosiast
1
@noncom: C'était la première langue dans laquelle j'ai vraiment fait des programmes importants. Il y a huit ans. C'est toujours l'un de mes deux meilleurs langages aujourd'hui (l'autre étant Python).
El'endia Starman,
1
@noncom, c'était aussi ma première langue. Je me demande comment je me sentirais l'utiliser professionnellement maintenant.
James Webster
12

Mathematica, 43 42 octets

ListPolarPlot@Array[(2.39996#)^{1,.5}&,#]&

Il s'agit d'une fonction sans nom prenant un argument entier, par exemple

entrez la description de l'image ici
La capture d'écran utilise une version plus ancienne, mais la sortie est identique.

Mathematica a en fait une fonction intégrée GoldenAnglepour des résultats encore plus précis, mais c'est plus long que 2.39996.

Martin Ender
la source
GoldenAngle! Est-ce une nouvelle fonction dans Mathematica 10.2?
alephalpha
@alephalpha Yep.
Martin Ender
11

MATLAB, 42 octets

t=2.39996*(1:input(''));polar(t,t.^.5,'.')

Obtient le numéro d'entrée, crée une plage de 1 à ce nombre.

Multiplie la plage par l'angle d'or en radians (la valeur utilisée est plus proche de la valeur réelle que 137,508 degrés à 6 pieds carrés).

Ensuite, tracez simplement thêta vs r sur un graphique de coordonnées polaires en utilisant des points. Ici montré avec 2000 points

Polaire

Un graphique légèrement plus joli (sans lignes de grille) serait ce code:

t=2.39996*(1:input(''));[x,y]=pol2cart(t,t.^.5);plot(x,y,'.');axis equal

Bien que cela se fasse au détriment de 31 octets. Encore une fois, il est montré avec 2000 points

Terrain

Tom Carpenter
la source
J'aime la polarsolution, je ne l'ai jamais utilisée auparavant. Je pense que vous pouvez économiser deux octets en utilisant t.^.5instad de sqrt(t)!
flawr
@flawr Merci. Deux octets en effet économisés.
Tom Carpenter
8

R, 58 55 54 octets

x=2.39996*1:scan();plotrix::radial.plot(x^.5,x,rp="s")

Cela nécessite que le plotrixpackage soit installé, mais il n'est pas nécessaire d'importer le package car nous référençons explicitement l'espace de noms.

Ungolfed:

# Read a number of STDIN
n <- scan()

x <- 2.39996*(1:n)

# The rp.type = "s" option specifies that we want to plot points rather
# than lines (the default)
plotrix::radial.plot(lengths = sqrt(x), radial.pos = x, rp.type = "s")

Exemple de sortie pour n = 1500:

entrez la description de l'image ici

Sauvegardé 3 octets grâce à plannapus!

Alex A.
la source
8

R, 55 54 octets

t=1:scan()*2.39996;r=t^.5;plot(r*cos(t),r*sin(t),as=1)

Voici le résultat pour n = 1000:

entrez la description de l'image ici

Edit: 1 octet enregistré en utilisant la correspondance partielle des arguments ( asau lieu de asp) grâce à @AlexA.!

planificateur
la source
6

R, 48 47 octets

Je pense que cela est suffisamment différent des autres solutions R jusqu'à présent. Celui-ci utilise des vecteurs complexes pour construire les coordonnées. le sqrt de t et t sont mis dans les paramètres de module et d'argument et les x, y sont tirés du réel et de l'imaginaire. Merci à @AlexA. pour l'octet.

plot(complex(,,,t^.5,t<-1:scan()*2.39996),as=1)

entrez la description de l'image ici

MickyT
la source
1
Non seulement c'est différent, c'est plus court! +1.
El'endia Starman,
Vous pouvez enregistrer un octet en utilisant une correspondance partielle des paramètres de fonction: aspeut être utilisé à la place de asp.
Alex A.
@AlexA. Merci Alex, j'oublie toujours de tester ceux-là :)
MickyT
3

Html + JavaScript 179

<canvas id=C></canvas><script>n=1500,C.width=C.height=400,T=C.getContext('2d');for(n=prompt(M=Math);n--;)r=M.sqrt(t=n*2.4)*9,T.fillRect(M.cos(t)*r+200,M.sin(t)*r+200,2,2)</script>

edc65
la source
2

Jolf, 25 octets

yG@@KyoΜzXDyOUH*Hm°yT'.}

entrez la description de l'image ici

(sortie pour n = 5000)

Essayez-le en ligne. (notez que la spirale résultante est petite)

Non compétitif depuis la création de Jolf après ce challenge. C'est 25 octets lorsqu'il est encodé avec ISO-8859-7, et il contient un non imprimable (voici un hexdump):

0000000: 7947 4096 404b 796f cc7a 5844 794f 5548  yG@[email protected]
0000010: 2a48 6db0 7954 272e 7d                   *Hm.yT'.}

Explication

yG@@KyoΜzXDyOUH*Hm°yT'.}
yG@@K                      goto (150,75) (center of the canvas)
     yo                    set current location as the origin
       MzX                 map over range 1...input
          D                start of function
           yO              goto polar coordinates ....
             UH            radius: square root of argument
               *Hm°        angle: argument times golden angle
                   yT'.    draw a dot there
                       }
un spaghetto
la source
2
Bien. Je pense que je vais devoir regarder Jolf maintenant, malgré l'encodage étrange.
lirtosiast
1

Python 2, 74 octets

from pylab import*
i=arange(1,input(),2.39996)
polar(i,sqrt(i),'o')
show()
William Stein
la source
1

MATL , 20 octets (non concurrent)

Marqué comme non concurrent car la langue est postérieure au défi

:2.4*tX^wJ*Ze*'.'&XG

Essayez-le sur MATL Online!

L'angle d'or, 137.708deg = pi*(3-sqrt(5))rad = 2.39996...rad est approximativement 2.4exprimé en rad.

La version suivante ( 25 octets ) utilise la valeur exacte, jusqu'à une doubleprécision à virgule flottante:

:YPI5X^-**tX^wJ*Ze*'.'&XG

Essayez-le à MATL Online!

Luis Mendo
la source
1

Tcl / Tk, 114

grid [canvas .c]
proc P n {time {incr i
.c cr o [lmap h {cos sin cos sin} {expr sqrt($i*2.4)*$h\($i*2.4)+99}]} $n}

Exemple d'utilisation:

P 1024

et sort la fenêtre

entrez la description de l'image ici

sergiol
la source