... c'est donc un défi de faire de moi un arbre.
Produisez un programme ou une fonction appelée arbre qui prend un seul argument entier, N et dessine un arbre de Pythagore N niveaux en profondeur, où le niveau 0 est juste le tronc.
Chaque jonction de l'arbre doit placer le sommet du triangle à un point aléatoire sur le périmètre (ce point doit être uniformément réparti sur au moins 5 points également espacés, ou uniformément sur tout le demi-cercle).
En option, votre arbre peut être en 3D, coloré ou éclairé en fonction de l'heure de la journée. Cependant, c'est du code-golf, donc le plus petit fichier gagne.
EDIT: Je vais fermer le concours et accepter la plus petite réponse quand elle aura une semaine
code-golf
graphical-output
alexander-brett
la source
la source
Réponses:
Mathematica,
246234221 caractèresCe n'est certainement pas la manière la plus élégante / la plus courte de le faire.
Usage:
f[8]
Et voici des exemples de sorties pour
f[6]
etf[10]
respectivement.Assez peu golfé:
la source
Show
là-dedans, etModule
c'est également inutile.Show
astuce, mais comment m'en débarrasserModule
? Si je ne déclare pasp
local, il sera écrasé dans les appels récursifs, donc je ne pourrais pas faire les deux appels avec le mêmep
, non?Block
ce qui est plus court queModule
.CFDG, 134 caractères
Celui-ci n'est pas exactement valide, car vous ne pouvez pas limiter la profondeur de récursivité. Mais le problème appelle simplement une solution dans celui-ci . :)
Les résultats ressemblent à ceci
Pour 46 autres caractères ( 180 caractères au total), vous pouvez même le colorier en:
la source
Postscript,
322270Edit: Il semble que
realtime
cela ne peut pas être utilisé comme une graine de générateur aléatoire appropriée. Par conséquent, nous utiliserons la variable d'environnement à cet effet et exécuterons le programme comme ça:ou
Maintenant, nos arbres sont moins prévisibles. 14 octets sont ajoutés au nombre total. Autres modifications: 1) L'argument du programme est maintenant passé sur la ligne de commande. 2) Aucun compteur d'itération explicite - la taille de la pile sert à cet effet (l'angle de rotation de la branche gauche est stocké sur la pile, pour dessiner la branche droite, plus tard). 3) Il n'y a pas de variable nommée pour la profondeur requise - la taille de la pile est son décalage, sur la pile. Il est laissé là à la sortie, c'est-à-dire qu'il n'est pas consommé.
Je pense que c'est assez évident - l'état graphique est préparé et la
f
procédure est appelée récursivement pour chaque niveau de profondeur consécutif, deux fois - pour les branches «gauche» et «droite». Travailler avec un rectangle de1x1
taille (voir l'échelle d'origine) évite de multiplier par la longueur du côté. L'angle de rotation de la branche gauche est randomisé - une des 5 divisions aléatoires également espacées est utilisée - je pense que cela empêche les cas laids possibles pour un caractère aléatoire uniforme.Il peut être lent pour une profondeur requise supérieure à 20 environ.
Vient ensuite la version golfée, utilisant des jetons binaires encodés en ASCII (voir la réponse de luser droog du sujet lié). Notez
cos
,sin
,rand
ne peut pas utiliser cette notation..
la source
-dGraphicsAlphaBits
est un indicateur de sortie anti-alias pour éviter les bords irréguliers de carrés plus grands, il peut être omis (ou «caché» par exemple dans la variable d'environnement). Certaines personnes peuvent l'aimer davantage sans ce drapeau (les feuilles des arbres obtiennent plus de «volume»). Eh bien, ces 20 octets ne sont pas très importants. Je dirais 20-25% de réduction sur l'utilisation de jetons binaires codés en ascii (à en juger par la réponse du sujet lié). Peut-être 50% de réduction sans codage ascii, 2 octets binaires par jeton de nom de système. Ressemblera à certaines langues généralement gagnantes;)Coffeescript
377B352BJe me sens sale en écrivant un coffeescript mais je ne trouve pas de package de dessin décent pour python3: - /
Javascript
393B385BUn peu plus joli en javascript et je suis beaucoup plus heureux avec la boucle for mais sans la [x, y, z] = une syntaxe que je ne peux pas faire assez courte pour battre coffeescript
Je dois dire que je suis un peu fâché, c'est presque deux fois plus longtemps que la solution mathématique: - / voir en action: http://jsfiddle.net/FK2NX/3/
la source
X
retourX
, vous pouvez les enchaîner. Et vous pouvez enregistrer un autre bon groupe de caractères en enregistrantM.sin
etM.cos
en variables à un seul caractère.s=M.sin
.rotate
sertthis
etsin
non. Vous auriez besoin de faire quelque chose comme çaR=X.rotate.bind(X)
, mais cela n'en vaut probablement plus la peine.