30
\$\begingroup\$

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.

\$\endgroup\$
14
  • 2
    \$\begingroup\$ 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! :) \$\endgroup\$
    – hyper-neutrino
    Sep 20, 2017 at 13:20
  • 2
    \$\begingroup\$ 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. \$\endgroup\$ Sep 20, 2017 at 13:36
  • 4
    \$\begingroup\$ That's far too quick to be accepting a solution! \$\endgroup\$
    – Shaggy
    Sep 20, 2017 at 13:38
  • 3
    \$\begingroup\$ Relevant Meta: codegolf.meta.stackexchange.com/q/5056/32352 \$\endgroup\$
    – Sanchises
    Sep 20, 2017 at 14:09
  • 2
    \$\begingroup\$ When I saw this challenge, this answer came to my mind... codegolf.stackexchange.com/a/6830/67961 and... it was yours \$\endgroup\$
    – ZaMoC
    Sep 20, 2017 at 21:26

14 Answers 14

21
\$\begingroup\$

Python 2, 32 bytes

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

Try it online!

\$\endgroup\$
15
\$\begingroup\$

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.

\$\endgroup\$
6
  • \$\begingroup\$ Sorry if there's anything wrong, first answer here. \$\endgroup\$
    – Manuel
    Sep 21, 2017 at 11:04
  • \$\begingroup\$ 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. \$\endgroup\$
    – Manuel
    Sep 21, 2017 at 11:08
  • \$\begingroup\$ 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). \$\endgroup\$ Sep 21, 2017 at 20:05
  • \$\begingroup\$ I will add it, but feel free to edit. \$\endgroup\$
    – Manuel
    Sep 21, 2017 at 20:17
  • \$\begingroup\$ Oops, didn't see your comment… added a very similar explanation; feel free to reject. +1 for the nice answer! \$\endgroup\$ Sep 21, 2017 at 20:30
8
\$\begingroup\$

SOGL V0.12, 16 12 bytes

 x5{"{^_}”;∑

Try it Here!

Port of Erik The Outgolfer's Python 2 answer

\$\endgroup\$
4
\$\begingroup\$

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}".:
\$\endgroup\$
1
  • \$\begingroup\$ I feel like "{x^x_x}" can be reduced ._. \$\endgroup\$ Sep 21, 2017 at 16:37
4
\$\begingroup\$

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.

\$\endgroup\$
2
  • \$\begingroup\$ "'x'"+"-replace'x','{x^x_x}'"*5|iex is a bit easier, no? \$\endgroup\$
    – Joey
    Sep 20, 2017 at 15:48
  • \$\begingroup\$ @Joey Oh, that's a clever way of doing it. Thanks! \$\endgroup\$ Sep 20, 2017 at 16:47
2
\$\begingroup\$

MATL, 21 20 bytes

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

-1 byte thanks to Giuseppe

Try it online!

\$\endgroup\$
1
  • 1
    \$\begingroup\$ 20 bytes with 'x'XJ5:"J'{x^x_x}'Zt or even 5pc5:"5pc'{x^x_x}'Zt \$\endgroup\$
    – Giuseppe
    Sep 20, 2017 at 14:18
2
\$\begingroup\$

JavaScript (ES6), 45 42 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'
\$\endgroup\$
0
2
\$\begingroup\$

05AB1E, 13 bytes

'x5F"{^_}"Ssý

Try it online!

Port of my Python 2 answer.

\$\endgroup\$
2
\$\begingroup\$

Jelly, 12 bytes

”x“{^_}”j$5¡

Try it online!

Port of my Python 2 answer.

\$\endgroup\$
2
\$\begingroup\$

Japt, 21 20 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

\$\endgroup\$
1
\$\begingroup\$

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!

\$\endgroup\$
2
  • \$\begingroup\$ I think you it is shorter to write t as a real functio instead of a lambda \$\endgroup\$ Sep 20, 2017 at 15:03
  • \$\begingroup\$ 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";}} \$\endgroup\$ Sep 20, 2017 at 15:03
0
\$\begingroup\$

Wolfram Language (Mathematica) - 40 characters

Summarizing 3 best answers here:

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]
\$\endgroup\$
4
  • 3
    \$\begingroup\$ It is not recommended to answer your own challenge, without leaving others a couple of days first. \$\endgroup\$
    – Mr. Xcoder
    Sep 20, 2017 at 12:59
  • 1
    \$\begingroup\$ Does your first code snippet not require 41 bytes? \$\endgroup\$ Sep 20, 2017 at 13:05
  • \$\begingroup\$ @Mr.Xcoder apologies, the editor form suggested as an option to post my own answer. Should I delete my answer? \$\endgroup\$ Sep 20, 2017 at 13:07
  • \$\begingroup\$ @VitaliyKaurov I think you should, other users will probably receive this badly. \$\endgroup\$
    – Mr. Xcoder
    Sep 20, 2017 at 13:08
0
\$\begingroup\$

C (gcc), 82 bytes

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

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Pyth, 17 16 13 bytes

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

Try it online!

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.