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\$
  • 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\$ – HyperNeutrino Sep 20 '17 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\$ – AdmBorkBork Sep 20 '17 at 13:36
  • 4
    \$\begingroup\$ That's far too quick to be accepting a solution! \$\endgroup\$ – Shaggy Sep 20 '17 at 13:38
  • 3
    \$\begingroup\$ Relevant Meta: codegolf.meta.stackexchange.com/q/5056/32352 \$\endgroup\$ – Sanchises Sep 20 '17 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\$ – J42161217 Sep 20 '17 at 21:26

14 Answers 14

8
\$\begingroup\$

SOGL V0.12, 16 12 bytes

 x5{"{^_}”;∑

Try it Here!

Port of Erik The Outgolfer's Python 2 answer

\$\endgroup\$
21
\$\begingroup\$

Python 2, 32 bytes

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

Try it online!

\$\endgroup\$
14
\$\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\$
  • \$\begingroup\$ Sorry if there's anything wrong, first answer here. \$\endgroup\$ – Manuel Sep 21 '17 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 '17 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\$ – ShreevatsaR Sep 21 '17 at 20:05
  • \$\begingroup\$ I will add it, but feel free to edit. \$\endgroup\$ – Manuel Sep 21 '17 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\$ – ShreevatsaR Sep 21 '17 at 20:30
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\$
  • \$\begingroup\$ I feel like "{x^x_x}" can be reduced ._. \$\endgroup\$ – Magic Octopus Urn Sep 21 '17 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\$
  • \$\begingroup\$ "'x'"+"-replace'x','{x^x_x}'"*5|iex is a bit easier, no? \$\endgroup\$ – Joey Sep 20 '17 at 15:48
  • \$\begingroup\$ @Joey Oh, that's a clever way of doing it. Thanks! \$\endgroup\$ – AdmBorkBork Sep 20 '17 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
    \$\begingroup\$ 20 bytes with 'x'XJ5:"J'{x^x_x}'Zt or even 5pc5:"5pc'{x^x_x}'Zt \$\endgroup\$ – Giuseppe Sep 20 '17 at 14:18
  • \$\begingroup\$ @Giuseppe Thanks! \$\endgroup\$ – Cinaski Sep 20 '17 at 14:23
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\$
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\$
  • \$\begingroup\$ I think you it is shorter to write t as a real functio instead of a lambda \$\endgroup\$ – Roman Gräf Sep 20 '17 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\$ – Kevin Cruijssen Sep 20 '17 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\$
  • 3
    \$\begingroup\$ It is not recommended to answer your own challenge, without leaving others a couple of days first. \$\endgroup\$ – Don't be a x-triple dot Sep 20 '17 at 12:59
  • 1
    \$\begingroup\$ Does your first code snippet not require 41 bytes? \$\endgroup\$ – Jonathan Frech Sep 20 '17 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\$ – Vitaliy Kaurov Sep 20 '17 at 13:07
  • \$\begingroup\$ @VitaliyKaurov I think you should, other users will probably receive this badly. \$\endgroup\$ – Don't be a x-triple dot Sep 20 '17 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 acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

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