Wygeneruj TeX do składu Fraktal trójkąta Sierpińskiego

30

Wyzwanie

Napisz kod, który wyprowadza kod równania matematycznego TeX (LaTeX) (podany poniżej), który będzie składał fraktal trójkąta Sierpińskiego o 5 poziomach. Najkrótszy kod wygrywa .

Detale

TeX (i przyjaciele tacy jak LaTeX itp.) To wyrafinowany system składu. Może renderować dowolne zagnieżdżone złożone wyrażenia dla formuł matematycznych. Przypadkowo ten „zagnieżdżony kompleks” opisuje także fraktale. Poniższe jest renderowane z MathJaX

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

za pomocą następującego prostego tekstu równania matematycznego składającego się z zagnieżdżonych superskryptów i podskryptów:

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

Pamiętaj, że jest to tylko 5-poziomowe zagnieżdżenie. Nie musisz generować $...$ani $$...$$używać innych znaczników wymaganych do rozpoczęcia / zakończenia równania matematycznego w TeX & Co. Możesz wyświetlić podgląd wygenerowanego TeX w wielu edytorach internetowych, na przykład: http://www.hostmath.com, ale możesz znaleźć wiele inni też. To pytanie zostało zainspirowane dyskusją z przyjaciółmi .

Aktualizacja

Jest podobne pytanie, ale jest ono bardziej ogólne i przyniesie różne rozwiązania. Chciałem zobaczyć naprawdę złożoność kolmogorowa dla bardzo naprawionego prostego kodu, który w jednym systemie (TeX) jest całkowicie jawny, podczas gdy w innym jest skompresowany. Dotyczy to również nkomentarza zamiast 5 poziomów.

Witalij Kaurow
źródło
2
Witaj; Zamknęłam twoje pytanie jako duplikat, ponieważ uważam, że odpowiedzi mogą być zbyt trywialnie zmodyfikowane w stosunku do drugiego pytania, aby odpowiedzieć na to pytanie. Jednak podoba mi się ten pomysł i myślę, że wygląda całkiem fajnie! :)
HyperNeutrino,
2
Ze względu na swoją wartość ponownie otworzyłem to pytanie, ponieważ nie widzę kodu, który można w trywialny sposób modyfikować przy tłumaczeniu z jednego na drugi.
AdmBorkBork
4
To zdecydowanie za szybko, aby zaakceptować rozwiązanie!
Shaggy
3
Odpowiednia meta: codegolf.meta.stackexchange.com/q/5056/32352
Sanchises
2
Kiedy zobaczyłem to wyzwanie, ta myśl przyszła mi do głowy ... codegolf.stackexchange.com/a/6830/67961 i ... to było twoje
J42161217

Odpowiedzi:

14

zwykły TeX, 29 bajtów

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

To daje to, co inni mają. Ale jeśli potrzebujemy kompilacji kodu, będzie to 6 bajtów więcej

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

Wyjaśnienie

~jest aktywną postacią w TeX, więc możemy nadać jej (nową) definicję.

\def~#1x{{#1x_#1x^#1x}}definiuje się ~jako makro, więc gdy TeX zobaczy ~, wykonuje następujące czynności:

  • Przeczytaj wszystko do następnego xi nazwij to #1(dopasowywanie wzorca).
  • Zamień wszystko na {#1x_#1x^#1x}

Na przykład ~ABCxzostałby zastąpiony przez {ABCx_ABCx^ABCx}.

Kiedy ~~~~~xjest używany, #1jest ~~~~, więc całość zostaje zastąpiona {~~~~x_~~~~x^~~~~x}. I tak dalej.

Kiedy mamy już długi ciąg, możemy wydrukować go do terminala z \message(i kończy się \byetak, aby TeX się zatrzymał), więc \message{~~~~~x}\bye. Lub wpisz wynikowe wyrażenie (jako wzór matematyczny), otaczając je w $s: so $~~~~~x$\bye.

Manuel
źródło
Przepraszam, jeśli coś jest nie tak, pierwsza odpowiedź tutaj.
Manuel
W przypadku dużego n(zamiast 5) bardziej efektywne może być utworzenie makra, które wyświetla listę ntyldy, ~zamiast pisania ~~~~~. Ponadto wyglądałoby to lepiej, jeśli całe wyrażenie jest składane pod \scriptscriptstyle.
Manuel
Fajna sztuczka… czy możesz dodać wyjaśnienie, czy możesz dodać jedno? Ilustruje to przyjemną funkcję dopasowywania wzorców w makrach TeX, która nie jest cechą wspólną dla wielu języków (o których wiem).
ShreevatsaR
Dodam go, ale możesz go edytować.
Manuel
Ups, nie widziałem twojego komentarza… dodał bardzo podobne wyjaśnienie; nie krępuj się odrzucić. +1 za miłą odpowiedź!
ShreevatsaR
4

05AB1E , 17 bajtów

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

Wypróbuj online!

Wyjaśnienie

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

Inne programy o tej samej liczbie bajtów obejmują

"{x^x_x}"©4F'x¡®ý
'x5F'x"{x^x_x}".:
Emigna
źródło
Czuję, że "{x^x_x}"można zmniejszyć ._.
Magic Octopus Urn
4

PowerShell ,  44  35 bajtów

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

Wypróbuj online!

Wielokrotnie używa mnożenia ciągów -replace x w przypadku podskryptów i superskryptów, a następnie wyprowadza dane wyjściowe.

Zaoszczędź 9 bajtów dzięki Joeyowi.

AdmBorkBork
źródło
"'x'"+"-replace'x','{x^x_x}'"*5|iexjest trochę łatwiejsze, nie?
Joey,
@Joey Oh, to sprytny sposób na zrobienie tego. Dzięki!
AdmBorkBork,
2

MATL ,21 20 bajtów

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

-1 bajt dzięki Giuseppe

Wypróbuj online!

Cinaski
źródło
1
20 bajtów z 'x'XJ5:"J'{x^x_x}'Ztlub nawet5pc5:"5pc'{x^x_x}'Zt
Giuseppe,
@Giuseppe Thanks!
Cinaski,
2

JavaScript (ES6), 45 42 37 bajtów

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

Edycja: Zapisano 3 2 bajty dzięki @Arnauld. Określenie 5 nadal kosztuje mnie 2 bajty; ta 41 40 35-bajtowa wersja przyjmuje zamiast tego parametr:

f=n=>n?[...'{^_}'].join(f(n-1)):'x'
Neil
źródło
2

05AB1E , 13 bajtów

'x5F"{^_}"Ssý

Wypróbuj online!

Port mojej odpowiedzi na Python 2.

Erik the Outgolfer
źródło
2

Japt , 21 20 18 bajtów

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

Sprawdź to


Wyjaśnienie

5Æ             Ã

Wygeneruj tablicę o długości 5 i odwzoruj na niej.

"\{^_}"¬

Podziel ciąg na tablicę znaków

qUª'x

Połącz ponownie ( q) z ciągiem, używając bieżącej wartości Ulub ( ª) "x".

=

Przypisz wynik tego do U.

Ì

Uzyskaj ostatni element w tablicy.


Alternatywy, 18 bajtów

To samo co powyżej, ale redukuje tablicę po jej utworzeniu.

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

Sprawdź to

Opcja rekurencyjna.

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

Sprawdź to

Kudłaty
źródło
1

Java (OpenJDK 8) , 179 167 bajtów

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

Wypróbuj online!

Roberto Graham
źródło
Myślę, że krótsze jest pisanie tjako prawdziwego funkio zamiast lambda
Roman Gräf
Jeśli używasz całego programu, t.apply(1)powinno być t.apply(new Integer(a[0]))zamiast. Ale dlaczego nie opublikować metody? String t(int n){return n>0?t(n-1).replace("x","{x^x_x}"):"x";}A jeśli wymaganiem byłby pełny program (który nie jest), zastosowanie metody rekurencyjnej Java 7 byłoby krótsze niż 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 znaków

Podsumowując 3 najlepsze odpowiedzi tutaj :

40 bajtów:

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

41 bajtów:

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

44 bajty:

Last@SubstitutionSystem["x"->"{x^x_x}","x",5]
Witalij Kaurow
źródło
3
Nie zaleca się odpowiadania na własne wyzwania, nie pozostawiając innym kilku dni wcześniej.
Pan Xcoder,
1
Czy Twój pierwszy fragment kodu nie wymaga 41 bajtów?
Jonathan Frech,
@ Mr.Xcoder przeprasza, formularz edytora zaproponował jako opcję opublikowania mojej własnej odpowiedzi. Czy powinienem usunąć swoją odpowiedź?
Vitaliy Kaurov,
@VitaliyKaurov Myślę, że powinieneś, inni użytkownicy prawdopodobnie otrzymają to źle.
Pan Xcoder,
0

Pyth, 17 16 13 bajtów

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

Wypróbuj online!

Tłumaczenie Python 3:
from functools import*;print(reduce(lambda x,y:x.join(y),["x"]+5*["{^_}"]))
hakr14
źródło