# Challenge

Write code that outputs TeX (LaTeX) math-equation code (given below) that will typeset Sierpinski Triangle Fractal of 5 levels. Shortest code wins.

# Details

TeX (and friends like LaTeX, etc.) is a sophisticated typesetting system. It can render arbitrary nested complex expressions for mathematical formulas. Coincidentally this "nested complex" is also descriptive of fractals. The following is rendered with MathJaX

$${{{{{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}}}}}$$

by the following plain-text math-equation code consisting of nested super- and sub-scripts:

{{{{{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}}}}}


Note this is just a 5-level nesting. You do not need to generate $...$ or $$...$$ or other markup required to start/end a math equation in TeX & Co. You can preview generated TeX in many online editors, for instance: http://www.hostmath.com but you can find many others too. This question was inspired by a discussion with friends.

# Update

There is a similar question but it much more general and will produce different solutions. I wanted to see really kolmogorov-complexity for a very fixed simple code that in one system (TeX) is completely explicit while in another compressed. This also address the n instead of 5 levels comment.

• Hello; I closed your question as a duplicate because I believe that answers can be too trivially modified from the other question to answer this question. However, I like the idea and I think it looks pretty cool! :) – HyperNeutrino Sep 20 '17 at 13:20
• For what it's worth, I reopened this question as I do not see the code as being trivially modifiable to translate from one to the other. – AdmBorkBork Sep 20 '17 at 13:36
• That's far too quick to be accepting a solution! – Shaggy Sep 20 '17 at 13:38
• Relevant Meta: codegolf.meta.stackexchange.com/q/5056/32352 – Sanchises Sep 20 '17 at 14:09
• When I saw this challenge, this answer came to my mind... codegolf.stackexchange.com/a/6830/67961 and... it was yours – J42161217 Sep 20 '17 at 21:26

# SOGL V0.12, 16 12 bytes

 x5{"{^_}”;∑


Try it Here!

Port of Erik The Outgolfer's Python 2 answer

# Python 2, 32 bytes

exec"print'x'"+".join('{^_}')"*5


Try it online!

# plain TeX, 29 bytes

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


That outputs what others have output. But if we need the code to be compilable it would be 6 bytes more

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


Explanation

~ is an active character in TeX, so we can give it a (new) definition.

\def~#1x{{#1x_#1x^#1x}} defines ~ as a macro, so that when TeX sees ~, it does the following:

• Read everything up to the next x, and call that #1 (pattern-matching).
• Replace the whole thing with {#1x_#1x^#1x}

For example, ~ABCx would get replaced with {ABCx_ABCx^ABCx}.

When ~~~~~x is used, #1 is ~~~~, so the whole thing gets replaced with {~~~~x_~~~~x^~~~~x}. And so on.

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. • Sorry if there's anything wrong, first answer here. – Manuel Sep 21 '17 at 11:04 • 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 Sep 21 '17 at 11:08 • 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 Sep 21 '17 at 20:05 • I will add it, but feel free to edit. – Manuel Sep 21 '17 at 20:17 • Oops, didn't see your comment… added a very similar explanation; feel free to reject. +1 for the nice answer! – ShreevatsaR Sep 21 '17 at 20:30 # 05AB1E, 17 bytes 'x5F'x¡"{x^x_x}"ý  Try it online! Explanation 'x # push "x" 5F # 5 times do 'x¡ # split on "x" "{x^x_x}"ý # join on "{x^x_x}"  Other programs at the same byte-count include "{x^x_x}"©4F'x¡®ý 'x5F'x"{x^x_x}".:  • I feel like "{x^x_x}" can be reduced ._. – Magic Octopus Urn Sep 21 '17 at 16:37 # PowerShell, 44 35 bytes "'x'"+"-replace'x','{x^x_x}'"*5|iex  Try it online! Uses string multiplication to repeatedly -replace xes with the sub- and super-scripts, then output. Saved 9 bytes thanks to Joey. • "'x'"+"-replace'x','{x^x_x}'"*5|iex is a bit easier, no? – Joey Sep 20 '17 at 15:48 • @Joey Oh, that's a clever way of doing it. Thanks! – AdmBorkBork Sep 20 '17 at 16:47 # MATL, 21 20 bytes 'x'XJ5:"J'{x^x_x}'Zt  -1 byte thanks to Giuseppe Try it online! • 20 bytes with 'x'XJ5:"J'{x^x_x}'Zt or even 5pc5:"5pc'{x^x_x}'Zt – Giuseppe Sep 20 '17 at 14:18 • @Giuseppe Thanks! – Cinaski Sep 20 '17 at 14:23 ## JavaScript (ES6), 4542 37 bytes f=n=>n>4?'x':[...'{^_}'].join(f(-~n))  Edit: Saved 3 2 bytes thanks to @Arnauld. Specifying 5 still costs me 2 bytes; this 41 40 35-byte version takes a parameter instead: f=n=>n?[...'{^_}'].join(f(n-1)):'x'  # 05AB1E, 13 bytes 'x5F"{^_}"Ssý  Try it online! Port of my Python 2 answer. # Jelly, 12 bytes ”x“{^_}”j$5¡


Try it online!

Port of my Python 2 answer.

# Japt, 2120 18 bytes

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


Test it

## Explanation

5Æ             Ã


Generate an array of length 5 and map over it.

"\{^_}"¬


Split a string to an array of characters

qUª'x


Rejoin (q) to a string using the current value of U or (ª) "x".

=


Assign the result of that to U.

Ì


Get the last element in the array.

## Alternatives, 18 bytes

Same as above but reducing the array after it's been created.

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


Test it

The recursive option.

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


Test it

# Java (OpenJDK 8), 179 167 bytes

@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";}


Try it online!

• I think you it is shorter to write t as a real functio instead of a lambda – Roman Gräf Sep 20 '17 at 15:03
• If you use an entire program, t.apply(1) should be t.apply(new Integer(a[0])) instead. But why not just post a method? String t(int n){return n>0?t(n-1).replace("x","{x^x_x}"):"x";} And if the requirement of the challenge would be a full program (which isn't), using a Java 7 recursive method would be shorter than a 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 Sep 20 '17 at 15:03

# Wolfram Language (Mathematica) - 40 characters

### 40 bytes:

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


### 41 bytes:

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


### 44 bytes:

Last@SubstitutionSystem["x"->"{x^x_x}","x",5]

• It is not recommended to answer your own challenge, without leaving others a couple of days first. – Mr. Xcoder Sep 20 '17 at 12:59
• Does your first code snippet not require 41 bytes? – Jonathan Frech Sep 20 '17 at 13:05
• @Mr.Xcoder apologies, the editor form suggested as an option to post my own answer. Should I delete my answer? – Vitaliy Kaurov Sep 20 '17 at 13:07
• @VitaliyKaurov I think you should, other users will probably receive this badly. – Mr. Xcoder Sep 20 '17 at 13:08

# C (gcc), 82 bytes

O(o){o--?_(125,O(o,_(95,O(o,_(94,O(o,_(123))))))):_(120);}main(){O(5);}


Try it online!

# Pyth, 1716 13 bytes

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


Try it online!

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