Contexte
Un système L (ou système Lindenmayer) est un système de réécriture parallèle qui, entre autres, peut être facilement utilisé pour modéliser des fractales. Cette question concerne les systèmes L déterministes et sans contexte . Il s'agit d'un alphabet de symboles, d'une chaîne d'axiomes initiale et d'un ensemble de règles de réécriture mappant chaque symbole d'alphabet sur une nouvelle chaîne. Les règles sont appliquées à l'axiome en parallèle, générant une nouvelle chaîne. Ce processus est ensuite répété.
Par exemple, le système avec l'axiome "A" et les règles A = ABA; B = BBB génère la séquence de chaînes "ABA", "ABABBBABA", "ABABBBABABBBBBBBBBABABBBABA", etc. Par souci de concision, nous ne mentionnons pas explicitement le alphabet lors de la définition du système L. De plus, tout symbole sans règle de réécriture explicite est supposé être inchangé (c'est-à-dire que la règle par défaut pour un symbole A est A = A).
Les L-systèmes peuvent être visualisés à l'aide d'une forme de graphique de tortue. Par convention, la tortue commence à faire face à droite. Une chaîne est ensuite dessinée en itérant sur ses symboles: un F signifie "avancer d'une unité", un G signifie "avancer d'une unité", un + signifie "tourner à gauche d'un angle" et un - - "tourner à droite d'un angle" unité". Tous les autres symboles de la chaîne sont ignorés. Aux fins de cette question, les unités d'angle sont supposées être toujours de 90 °.
Tâche
Étant donné une spécification de tout système L et un certain nombre d'itérations, votre programme doit produire un rendu ASCII de la chaîne résultante (comme décrit ci-dessus) en utilisant des caractères de dessin de boîte.
- Les paramètres sont transmis sous la forme d'une chaîne séparée par des espaces comprenant l'axiome, les règles de réécriture (sous forme d'une liste d'équations séparées par) et le nombre d'itérations de réécriture. Par exemple, l'entrée "FF = FGF; G = GGG 2" génère la chaîne "FGFGGGFGF" et trace ainsi quatre lignes avec les espaces appropriés.
- Les symboles utilisés par le système L peuvent être n'importe quel caractère ASCII à l'exception de l'espace et du point-virgule. Il existe au plus une règle explicite spécifiée par symbole (la règle de réécriture par défaut étant le mappage d'identité comme décrit ci-dessus).
- Vous pouvez supposer que la sortie contiendra toujours au moins un F.
- La sortie doit utiliser les caractères de dessin de boîte UNICODE suivants pour représenter la visualisation: ─ (U + 2500), │ (U + 2502), ┌ (U + 250C), ┐ (U + 2510), └ (U + 2514) , ┘ (U + 2518), ├ (U + 251C), ┤ (U + 2524), ┬ (U + 252C), ┴ (U + 2534), ┼ (U + 253C), ╴ (U + 2574), ╵ (U + 2575), ╶ (U + 2576) et ╷ (U + 2577). Voir ci-dessous pour des exemples.
- La sortie ne doit pas contenir de lignes vides au-dessus du caractère de la case supérieure ou en dessous de la dernière. Il ne doit pas non plus contenir d'espace à gauche du caractère de la boîte la plus à gauche ou à droite de la plus à droite. Les lignes avec des espaces de fin qui ne s'étendent pas au-delà du caractère de boîte le plus à droite sont autorisées.
Vous pouvez écrire un programme ou une fonction, en prenant des entrées via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction. Les résultats doivent être imprimés dans STDOUT (ou l'alternative la plus proche), enregistrés dans un fichier ou retournés sous forme de chaîne.
Exemples
# Cantor dust
>> "F F=FGF;G=GGG 0"
╶╴
>> "F F=FGF;G=GGG 1"
╶╴╶╴
>> "F F=FGF;G=GGG 2"
╶╴╶╴ ╶╴╶╴
>> "F F=FGF;G=GGG 3"
╶╴╶╴ ╶╴╶╴ ╶╴╶╴ ╶╴╶╴
# Koch curve
>> "F F=F+F−F−F+F 1"
┌┐
╶┘└╴
>> "F F=F+F-F-F+F 2"
┌┐
┌┘└┐
┌┘ └┐
┌┼┐ ┌┼┐
╶┘└┘ └┘└╴
Voici d'autres exemples pour tester votre programme:
# Dragon curve
>> "FX X=X+YF+;Y=-FX-Y n"
# Hilbert curve
>> "A A=-BF+AFA+FB-;B=+AF-BFB-FA+ n"
# Sierpinski carpet
>> "F F=F+F-F-F-G+F+F+F-F;G=GGG n"
Les deux premiers se présentent comme suit (produits à l'aide de la réponse de @ edc65):
Vous pouvez tester n'importe quel système sur cette page .
Notation
Le code le plus court (en octets) gagne. Des règles standard s'appliquent.
Miscellania
Ce défi a été inspiré par Draw a Random Walk with Slashes . En fait, il est possible de représenter une marche aléatoire comme un L-système si nous étendons le système pour autoriser plusieurs règles par symbole, avec l'expansion choisie de manière non déterministe lors de la réécriture. Une formulation est:
"F F=FF;F=F+F;F=F++F;F=F+++F"
Une autre extension courante, souvent utilisée lors de la modélisation de plantes, consiste à interpréter les caractères [et] comme poussant et sautant la position et l'angle actuels. La plupart des plantes utilisent des angles inférieurs à 90 °, mais voici un exemple qui ne fonctionne pas:
"FAX X=[-FAX][FAX][+FAX];A=AFB;B=A"
Aucun de ces exemples ne doit être soutenu dans ce défi.
Ce défi est également similaire à "Désolé, jeune homme, mais c'est des tortues tout le long!" . Cependant, ce défi utilisait le rendu de ligne plutôt que ASCII et permettait une syntaxe plus flexible.