Générer TeX pour composer la fractale triangulaire de Sierpinski

30

Défi

Écrivez le code qui produit le code d'équation mathématique TeX (LaTeX) (donné ci-dessous) qui composera Sierpinski Triangle Fractal de 5 niveaux. Le code le plus court gagne .

Détails

TeX (et des amis comme LaTeX, etc.) est un système de composition sophistiqué. Il peut rendre des expressions complexes imbriquées arbitraires pour les formules mathématiques. Par coïncidence, ce «complexe imbriqué» est également descriptif des fractales. Ce qui suit est rendu avec MathJaX

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

par le code d'équation mathématique en texte clair composé de super et de sous-scripts imbriqués:

{{{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}^{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}_{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}}^{{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}^{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}_{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}}_{{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}^{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}_{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}}}

Notez qu'il s'agit simplement d'une imbrication à 5 niveaux. Vous n'avez pas besoin de générer $...$ou $$...$$ou un autre balisage requis pour démarrer / terminer une équation mathématique dans TeX & Co. Vous pouvez prévisualiser le TeX généré dans de nombreux éditeurs en ligne, par exemple: http://www.hostmath.com mais vous pouvez trouver de nombreux d'autres aussi. Cette question a été inspirée par une discussion avec des amis .

Mise à jour

Il y a une question similaire mais beaucoup plus générale et produira des solutions différentes. Je voulais vraiment voir la complexité de kolmogorov pour un code simple très fixe qui dans un système (TeX) est complètement explicite tandis que dans un autre compressé. Cela concerne également le ncommentaire au lieu de 5 niveaux.

Vitaliy Kaurov
la source
2
Bonjour; J'ai fermé votre question en double car je pense que les réponses peuvent être trop trivialement modifiées par rapport à l'autre question pour répondre à cette question. Cependant, j'aime l'idée et je pense qu'elle a l'air plutôt cool! :)
HyperNeutrino
2
Pour ce que ça vaut, j'ai rouvert cette question car je ne vois pas le code comme étant trivialement modifiable pour traduire de l'un à l'autre.
AdmBorkBork
4
C'est beaucoup trop rapide pour accepter une solution!
Shaggy
3
Méta pertinente: codegolf.meta.stackexchange.com/q/5056/32352
Sanchises
2
Quand j'ai vu ce défi, cette réponse m'est venue à l'esprit ... codegolf.stackexchange.com/a/6830/67961 et ... c'était le vôtre
J42161217

Réponses:

14

TeX simple, 29 octets

\def~#1x{{#1x_#1x^#1x}}~~~~~x

Cela produit ce que les autres ont produit. Mais si nous avons besoin que le code soit compilable, ce serait 6 octets de plus

\def~#1x{{#1x_#1x^#1x}}$~~~~~x$\bye

Explication

~est un personnage actif dans TeX, nous pouvons donc lui donner une (nouvelle) définition.

\def~#1x{{#1x_#1x^#1x}}définit ~comme une macro, de sorte que lorsque TeX voit ~, il fait ce qui suit:

  • Lisez tout jusqu'au prochain x, et appelez cela #1(correspondance de modèle).
  • Remplacez le tout par {#1x_#1x^#1x}

Par exemple, ~ABCxserait remplacé par {ABCx_ABCx^ABCx}.

Quand ~~~~~xest utilisé, #1est ~~~~, donc le tout est remplacé par {~~~~x_~~~~x^~~~~x}. Etc.

Once we have the long string, we can print it out to terminal with \message (and ending with a \bye so TeX stops), so \message{~~~~~x}\bye. Or typeset the resulting expression (as a mathematical formula), by surrounding it in $s : so $~~~~~x$\bye.

Manuel
la source
Sorry if there's anything wrong, first answer here.
Manuel
For a big n (rather than 5) it could be more efficient to create a macro that outputs a list of n tildes ~ rather than writing ~~~~~. Plus it would look better if the whole expression is typeset under \scriptscriptstyle.
Manuel
Nice trick… can you add an explanation, or mind if I add one? This illustrates a nice feature of pattern-matching in TeX macros, which is not a feature common to many languages (that I know of).
ShreevatsaR
I will add it, but feel free to edit.
Manuel
Oups, vous n'avez pas vu votre commentaire… a ajouté une explication très similaire; n'hésitez pas à rejeter. +1 pour la belle réponse!
ShreevatsaR,
4

05AB1E , 17 octets

'x5F'x¡"{x^x_x}"ý

Essayez-le en ligne!

Explication

'x                  # push "x"
  5F                # 5 times do
    'x¡             # split on "x"
       "{x^x_x}"ý   # join on "{x^x_x}"

D'autres programmes avec le même nombre d'octets incluent

"{x^x_x}"©4F'x¡®ý
'x5F'x"{x^x_x}".:
Emigna
la source
J'ai l'impression "{x^x_x}"qu'on peut réduire ._.
Magic Octopus Urn
4

PowerShell ,  44  35 octets

"'x'"+"-replace'x','{x^x_x}'"*5|iex

Essayez-le en ligne!

Utilise la multiplication de chaînes à plusieurs reprises -replace xavec les sous-scripts et les super-scripts, puis sort.

Enregistré 9 octets grâce à Joey.

AdmBorkBork
la source
"'x'"+"-replace'x','{x^x_x}'"*5|iexc'est un peu plus simple, non?
Joey
@ Joey Oh, c'est une façon intelligente de le faire. Merci!
AdmBorkBork
2

MATL ,21 20 octets

'x'XJ5:"J'{x^x_x}'Zt

-1 octet grâce à Giuseppe

Essayez-le en ligne!

Cinaski
la source
1
20 octets avec 'x'XJ5:"J'{x^x_x}'Ztou même5pc5:"5pc'{x^x_x}'Zt
Giuseppe
@Giuseppe Merci!
Cinaski
2

JavaScript (ES6), 45 42 37 octets

f=n=>n>4?'x':[...'{^_}'].join(f(-~n))

Edit: enregistré 3 2 octets grâce à @Arnauld. La spécification de 5 me coûte encore 2 octets; cette version 41 40 35 octets prend un paramètre à la place:

f=n=>n?[...'{^_}'].join(f(n-1)):'x'
Neil
la source
2

Japt , 21 20 18 octets

5Æ="\{^_}"¬qUª'xÃÌ

Essaye-le


Explication

5Æ             Ã

Générez un tableau de longueur 5 et mappez dessus.

"\{^_}"¬

Fractionner une chaîne en un tableau de caractères

qUª'x

Rejoin ( q) à une chaîne en utilisant la valeur actuelle de Uou ( ª) "x".

=

Attribuez le résultat à U.

Ì

Récupère le dernier élément du tableau.


Alternatives, 18 octets

Identique à ci-dessus mais en réduisant le tableau après sa création.

5o r@"\{^_}"¬qX}'x

Essaye-le

L'option récursive.

>4©'xª"\{^_}"¬qßUÄ

Essaye-le

Hirsute
la source
1

Java (OpenJDK 8) , 179 167 octets

@Neil port

interface Y{static void main(String[]a){System.out.println(t.apply(1));}java.util.function.Function<Integer,String>t=N->N>0?Y.t.apply(N-1).replace("x","{x^x_x}"):"x";}

Essayez-le en ligne!

Roberto Graham
la source
Je pense que c'est plus court pour écrire tcomme une vraie fonction au lieu d'une lambda
Roman Gräf
Si vous utilisez un programme entier, t.apply(1)devrait l'être à la t.apply(new Integer(a[0]))place. Mais pourquoi ne pas simplement publier une méthode? String t(int n){return n>0?t(n-1).replace("x","{x^x_x}"):"x";}Et si l'exigence du défi était un programme complet (ce qui n'est pas le cas), l'utilisation d'une méthode récursive Java 7 serait plus courte qu'un lambda:interface Y{static void main(String[]a){System.out.print(t(new Integer(a[0])));}static String t(int n){return n>0?t(n-1).replace("x","{x^x_x}"):"x";}}
Kevin Cruijssen
0

Wolfram Language ( Mathematica ) - 40 caractères

Résumant les 3 meilleures réponses ici :

40 octets:

Nest["{"<>#<>"_"<>#<>"^"<>#<>"}"&,"x",5]

41 octets:

Nest[StringReplace["x"->"{x^x_x}"],"x",5]

44 octets:

Last@SubstitutionSystem["x"->"{x^x_x}","x",5]
Vitaliy Kaurov
la source
3
Il n'est pas recommandé de répondre à votre propre défi, sans laisser les autres quelques jours au préalable.
M. Xcoder
1
Votre premier extrait de code ne nécessite-t-il pas 41 octets?
Jonathan Frech
@ Excuses Mr.Xcoder, le formulaire de l'éditeur a suggéré comme option de poster ma propre réponse. Dois-je supprimer ma réponse?
Vitaliy Kaurov
@VitaliyKaurov Je pense que vous devriez, les autres utilisateurs recevront probablement mal cela.
M. Xcoder,
0

Pyth, 17 16 13 octets

jF+\x*5]"{^_}

Essayez-le en ligne!

Traduction Python 3:
from functools import*;print(reduce(lambda x,y:x.join(y),["x"]+5*["{^_}"]))
hakr14
la source