Генерация TeX для набора текста по фракталу Серпинского треугольника

30

Вызов

Напишите код, который выводит код математического уравнения TeX (LaTeX) (приведенный ниже), который будет набирать фрактал Серпинского из 5 уровней. Самый короткий код выигрывает .

Детали

TeX (и его друзья, такие как LaTeX и т. Д.) - сложная система набора текста. Может отображать произвольные вложенные сложные выражения для математических формул. По совпадению этот «вложенный комплекс» также является описанием фракталов. Следующее отображается с 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}}}}}

Обратите внимание, что это всего лишь 5-уровневая вложенность. Вам не нужно генерировать $...$или $$...$$другую разметку, необходимую для начала / завершения математического уравнения в TeX & Co. Вы можете просмотреть сгенерированный TeX во многих онлайн-редакторах, например: http://www.hostmath.com, но вы можете найти много другие тоже. Этот вопрос был вдохновлен обсуждением с друзьями .

Обновить

Есть похожий вопрос, но он гораздо более общий и даст разные решения. Я хотел увидеть действительно колмогоровскую сложность для очень фиксированного простого кода, который в одной системе (TeX) полностью явный, а в другой сжатый. Это также относится nк комментариям вместо 5 уровней.

Виталий Кауров
источник
2
Здравствуйте; Я закрыл ваш вопрос как дубликат, потому что я считаю, что ответы могут быть слишком тривиально изменены по сравнению с другим вопросом, чтобы ответить на этот вопрос. Тем не менее, мне нравится идея, и я думаю, что она выглядит довольно круто! :)
HyperNeutrino
2
Что бы это ни стоило, я снова открыл этот вопрос, так как не вижу в коде тривиально изменяемого кода для перевода из одного в другой.
AdmBorkBork
4
Это далеко слишком быстро , чтобы быть принятие решения!
Лохматый
3
Соответствующая мета: codegolf.meta.stackexchange.com/q/5056/32352
Sanchises
2
Когда я увидел этот вызов, мне пришло в голову этот ответ ... codegolf.stackexchange.com/a/6830/67961 и ... он был ваш
J42161217

Ответы:

14

обычный TeX, 29 байт

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

Это выводит то, что есть у других. Но если нам нужен код для компиляции, он будет на 6 байт больше

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

объяснение

~является активным символом в TeX, поэтому мы можем дать ему (новое) определение.

\def~#1x{{#1x_#1x^#1x}}определяется ~как макрос, так что когда TeX видит ~, он делает следующее:

  • Прочитайте все до следующего xи назовите это #1(сопоставление с образцом).
  • Заменить все это {#1x_#1x^#1x}

Например, ~ABCxбудет заменен на {ABCx_ABCx^ABCx}.

Когда ~~~~~xиспользуется, #1есть ~~~~, так что все это заменяется {~~~~x_~~~~x^~~~~x}. И так далее.

Как только мы получим длинную строку, мы можем распечатать ее на терминал с помощью \message(и заканчивая \byeтак, чтобы TeX останавливался), так что \message{~~~~~x}\bye. Или наберите полученное выражение (как математическую формулу), заключив его в $s: so $~~~~~x$\bye.

Manuel
источник
Извините, если что-то не так, сначала ответьте здесь.
Мануэль
Для большого n(а не 5) может быть более эффективным создать макрос, который выводит список nтильд, ~а не запись ~~~~~. Кроме того, он будет выглядеть лучше , если все выражение типографских под \scriptscriptstyle.
Мануэль
Хороший трюк ... можете ли вы добавить объяснение или возражаете, если я добавлю его? Это иллюстрирует хорошую функцию сопоставления с образцом в макросах TeX, которая не является общей для многих языков (о которых я знаю).
ShreevatsaR
Я добавлю это, но не стесняйтесь редактировать.
Мануэль
К сожалению, не видел ваш комментарий ... добавил очень похожее объяснение; не стесняйтесь отклонить. +1 за хороший ответ!
ShreevatsaR
4

05AB1E , 17 байт

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

Попробуйте онлайн!

объяснение

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

Другие программы с таким же количеством байтов включают

"{x^x_x}"©4F'x¡®ý
'x5F'x"{x^x_x}".:
Emigna
источник
Я чувствую, что "{x^x_x}"может быть уменьшен.
Волшебная урна осьминога
4

PowerShell ,  44  35 байт

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

Попробуйте онлайн!

Использует умножение строк для многократного -replace xпреобразования с использованием вспомогательных и суперскриптов, а затем вывод.

Сохранено 9 байтов благодаря Joey.

AdmBorkBork
источник
"'x'"+"-replace'x','{x^x_x}'"*5|iexнемного проще, нет?
Джои
@ Джои О, это умный способ сделать это. Благодарность!
AdmBorkBork
2

MATL ,21 20 байт

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

-1 байт благодаря Джузеппе

Попробуйте онлайн!

Cinaski
источник
1
20 байтов с 'x'XJ5:"J'{x^x_x}'Ztили даже5pc5:"5pc'{x^x_x}'Zt
Джузеппе
@ Giuseppe Спасибо!
Чинаски
2

JavaScript (ES6), 45 42 37 байт

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

Редактировать: Сохранено 3 2 байта благодаря @Arnauld. Указание 5 все еще стоит мне 2 байта; эта 41 40 35-байтовая версия принимает параметр вместо:

f=n=>n?[...'{^_}'].join(f(n-1)):'x'
Нил
источник
2

Japt , 21 20 18 байт

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

Попробуй это


объяснение

5Æ             Ã

Создайте массив длиной 5 и отобразите его.

"\{^_}"¬

Разделить строку на массив символов

qUª'x

Вернитесь ( q) к строке, используя текущее значение Uили ( ª) "x".

=

Назначьте результат этого U.

Ì

Получить последний элемент в массиве.


Альтернативы, 18 байт

То же, что и выше, но уменьшение массива после его создания.

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

Попробуй это

Рекурсивный вариант.

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

Попробуй это

мохнатый
источник
1

Java (OpenJDK 8) , 179 167 байт

@ Нейл порт

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

Попробуйте онлайн!

Роберто Грэм
источник
Я думаю, что вы короче, чтобы написать tкак реальную функцию вместо лямбда
Роман Gräf
Если вы используете всю программу, t.apply(1)должно быть t.apply(new Integer(a[0]))вместо. Но почему бы просто не опубликовать метод? String t(int n){return n>0?t(n-1).replace("x","{x^x_x}"):"x";}И если требованием задачи будет полная программа (а это не так), использование рекурсивного метода Java 7 будет короче лямбды: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";}}
Кевин Круйссен
0

Wolfram Language ( Mathematica ) - 40 знаков

Обобщая 3 лучших ответа здесь :

40 байтов:

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

41 байт:

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

44 байта:

Last@SubstitutionSystem["x"->"{x^x_x}","x",5]
Виталий Кауров
источник
3
Не рекомендуется отвечать на свой собственный вызов, не оставляя другим пару дней.
г-н Xcoder
1
Ваш первый фрагмент кода не требует 41 байт?
Джонатан Фрех
@ Mr.Xcoder извиняюсь, форма редактора предложена как вариант, чтобы опубликовать мой собственный ответ. Должен ли я удалить свой ответ?
Виталий Кауров
@VitaliyKaurov Я думаю, что вы должны, другие пользователи, вероятно, получат это плохо.
г-н Xcoder