Exécuter un système Lindenmayer
Un système Lindenmayer (ou système L) est lié aux systèmes Thue et Post , et est utilisé dans la modélisation botanique et la génération fractale .
Un système L est décrit par réécriture de chaînes où un symbole de l'alphabet de symboles est mappé à une séquence de remplacement de symboles. Une collection de ces mappages constitue le système L proprement dit.
La méthode de sortie graphique conçue par Prusinkiewicz interprète la séquence résultante après que les mappages ont été appliqués à une séquence initiale pour un nombre spécifié d' itérations , en tant que commandes Turtle-Drawing: avant, arrière, gauche, droite, ce genre de choses. Cela peut nécessiter un code supplémentaire pour contrôler l'échelle du dessin, car différents nombres d'itérations peuvent produire des images de tailles radicalement différentes.
Votre tâche consiste à exécuter un système L avec le moins de caractères. Votre programme doit être capable de rendre à la fois la courbe de dragon et les tiges de branchement à partir de la page Wikipedia en fournissant une entrée appropriée (fichier, ligne de commande, mais externe à la source, s'il vous plaît).
C'est le golf de code.
Edit: Voici quelques exemples que j'ai publiés dans la ville. réponse à SO / rotation vers le nord { où j'ai découvert le système L pour la première fois } , réponse à SO / comment-programmer-une-fractale , réponse à SO / récursion-en-postscript , discussion comp.lang.postscript / considérant , collection postscript l-system , codegolf.SE/draw-a-sierpinski-triangle {origine de la compétition entre moi et thomasW} .
la source
Réponses:
Mathematica
200198188171168 168Espaces ajoutés pour plus de clarté:
Où:
Grammaire des règles de production:
La séquence {2,4,6,8} est là parce que j'utilise
I^n
(I
= unité imaginaire) pour faire des tours.Exemples:
la source
Graphics@k
parGraphics@Flatten@k
si vous prévoyez d'utiliser plusieurs itérations. Sinon, une limite de récursivité vous mordra et votre session Mma s'interrompra.Python,
369294Pas un gagnant mais je publierai ce que j'ai essayé de toute façon.
Pas bon au golf Python ...... Peut-être que quelqu'un d'autre peut le faire.
Contribution
L'entrée provient d'un fichier externe nommé "l" (sans extension), au format suivant:
Ligne 1 : état initial (Axiom)
Ligne 2 : règles séparées par des virgules
Symboles
f
etF
: Dessin en avant+
: Tournez à droite de 5 degrés-
: Tournez à gauche de 5 degrés[
: Enregistrez la position et le cap]
: Position pop et capD'autres symboles sont ignorés par la fonction de dessin.
Règles
Une règle est au format
"predecessor":"successor(s)"
Notez que les guillemets sont nécessaires, qu'ils soient simples ou doubles.
predecessor
doit être un seul caractère.De plus, il n'y a pas de constantes implicites: vous devez explicitement spécifier une règle de non-modification pour celles-ci.
Exemples
Tiges ramifiées
Sortie
Notez que la source est modifiée pour obtenir ce résultat, UNIQUEMENT POUR ÉCHANGER LE GRAPHIQUE DANS LA ZONE VISIBLE. La console sert également à masquer la "tortue".
Courbe de dragon
Sortie
Encore une fois, la console est utilisée pour masquer la "tortue".
Triangle de Sierpinski
Générations de sortie réduites à 5 ici.
la source
f
,r
,l
; ajouter un paramètre factice ào
etc
; puis changer le pseudo-commutateur en{'f':fd,'F':fd,'+':rt,'-':lt,'[':o,']':c}[k](5)
g
, et je penseo
etc
vaut la peine d'éliminer avec lesif
déclarations inline (moins cher que laglobal
déclaration)o
etc
directement dans le pseudo-commutateur) ont donné des erreurs de syntaxe, mais d'autres ne l'ont pas fait '' t.s,R,*p=input().split()
. 3. Générez la valeur finale des
parexec('s="".join(map(eval(R).get,s));'*8)
. 4. Laissez de côtécontinue
. 5. Indentation d'un seul espace. 6. Économisez de l'espace après leif
en changeant les côtés du test. 7. Mettezk:int
ladict
(première entrée) et vous n'avez pas besoinexcept: try:
. (Je reçois 215 caractères.)Javascript (179 octets)
Pas complètement sûr que cela se qualifie, car l'objet de règles effectue tout le dessin réel.
Démo (Dragon, animé):
- Développé: http://jsfiddle.net/SVkMR/9/show/light
- Avec code: http://jsfiddle.net/SVkMR/9/
Minifié:
Lisible (ish):
Contribution:
Usage:
Bonus: Golden Spiral http://jsfiddle.net/SVkMR/35/show/light/
la source
Postscript
264298295255Voici ma tentative de le faire différemment. Plutôt que la macro-expansion que j'utilise habituellement, celle-ci vérifie la taille de la pile d'exécution pour délimiter la récursivité. Si la limite est dépassée, il arrête d'examiner récursivement la procédure et essaie d'interpréter les commandes de tortue (et les rejette
pop pop
sinon). Un avantage de cette méthode est qu'elle ne nécessite pas d'énormes quantités de mémoire. Un inconvénient est que le contrôle de récursivité est plutôt maladroit, car la taille de la pile augmente de plus de 1 d'un niveau de récursivité au suivant.Edit: +34 caractères pour la ramification.
Edit: -3 caractères. Reconçu pour utiliser la pile d'opérandes pour le contrôle de la récursivité. Cela rend le système de base beaucoup plus simple. Mais les supports ont besoin d'une pile indépendante, j'ai donc mis la position enregistrée dans la pile de dictionnaires et j'ai presque remboursé toutes les économies.
Aussi, repensé pour utiliser des chaînes et des entiers au lieu des tableaux et des noms.
Modifier: -40 caractères. Ajout de deux procédures pour appeler les noms de système par numéro (je n'arrive pas à faire fonctionner les jetons binaires bruts . Mais cet idiome fonctionne pour moi.)
Binaire semi-commenté.
Un- "binaire".
Il nécessite que le système L soit défini dans un dictionnaire sur la pile de dictées, avec la chaîne initiale et la position de départ de la tortue sur la pile d'opérandes (ajoutée à la source, par exemple
gs dragon.sys lsys.ps
).Courbe du dragon.
Tiges de ramification.
Non golfé et commenté.
Pour l'exécuter, ces 3 blocs peuvent être enregistrés sous 3 fichiers: dragon.ps, stems.ps, lsys.ps (n'importe lequel des blocs de programme ci-dessus fonctionnera de manière identique). Ensuite, exécutez avec gs:
gs dragon.ps lsys.ps
ougs stems.ps lsys.ps
. Ils peuvent également être concaténés en premier, si vous le souhaitez:cat dragon.ps lsys.ps | gs -
oucat stems.ps lsys.ps | gs -
.Aucune image de tiges. Cela ne devient plus intéressant à des profondeurs plus élevées.
la source
Mathematica 290
Cette implémentation simple met l'accent sur la sortie plutôt que sur le traitement. Il n'utilise pas de règles de production. Ce n'est donc peut-être pas une réponse appropriée au défi.
Tiges ramifiées adaptées de la démonstration de Theo Gray .
Code
Usage
Le premier paramètre détermine si la courbe du dragon ou les tiges de branche seront affichées. Le deuxième terme fait référence à la génération.
Plus d'exemples
la source
A->F[+A][-A]
oùF
se déplace,+
tourne à gauche 30,-
tourne à droite 30 et[
/]
est push / pop