Genere TeX para componer el fractal del triángulo de Sierpinski

30

Reto

Escriba el código que genera el código de ecuación matemática TeX (LaTeX) (que se proporciona a continuación) que compondrá el Fractal Triángulo Sierpinski de 5 niveles. El código más corto gana .

Detalles

TeX (y amigos como LaTeX, etc.) es un sofisticado sistema de composición. Puede representar expresiones complejas anidadas arbitrarias para fórmulas matemáticas. Casualmente, este "complejo anidado" también es descriptivo de fractales. Lo siguiente se representa con MathJaX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

mediante el siguiente código de ecuación matemática de texto sin formato que consta de super y scripts secundarios anidados:

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

Tenga en cuenta que esto es solo un anidamiento de 5 niveles. No necesita generar $...$u $$...$$otro marcado necesario para comenzar / finalizar una ecuación matemática en TeX & Co. Puede obtener una vista previa de TeX generado en muchos editores en línea, por ejemplo: http://www.hostmath.com pero puede encontrar muchos otros también Esta pregunta fue inspirada por una discusión con amigos .

Actualizar

Hay una pregunta similar, pero es mucho más general y producirá diferentes soluciones. Quería ver realmente la complejidad de kolmogorov para un código simple muy fijo que en un sistema (TeX) es completamente explícito mientras que en otro está comprimido. Esto también aborda el ncomentario en lugar de 5 niveles.

Vitaliy Kaurov
fuente
2
Hola; Cerré su pregunta como un duplicado porque creo que las respuestas pueden modificarse demasiado trivialmente de la otra pregunta para responderla. Sin embargo, me gusta la idea y creo que se ve muy bien. :)
HyperNeutrino
2
Por lo que vale, volví a abrir esta pregunta ya que no veo que el código sea trivialmente modificable para traducir de uno a otro.
AdmBorkBork
44
Eso es mucho demasiado rápido para aceptar una solución!
Shaggy
3
Meta relevante: codegolf.meta.stackexchange.com/q/5056/32352
Sanchises
2
Cuando vi este desafío, me vino a la mente esta respuesta ... codegolf.stackexchange.com/a/6830/67961 y ... fue tuyo
J42161217

Respuestas:

14

TeX simple, 29 bytes

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

Eso da salida a lo que otros tienen salida. Pero si necesitamos que el código sea compilable, serían 6 bytes más

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

Explicación

~es un personaje activo en TeX, por lo que podemos darle una (nueva) definición.

\def~#1x{{#1x_#1x^#1x}}se define ~como una macro, de modo que cuando TeX ve ~, hace lo siguiente:

  • Lea todo hasta el siguiente x, y llame a eso #1(coincidencia de patrones).
  • Reemplazar todo con {#1x_#1x^#1x}

Por ejemplo, ~ABCxsería reemplazado por {ABCx_ABCx^ABCx}.

Cuando ~~~~~xse usa, #1es ~~~~, entonces todo se reemplaza con {~~~~x_~~~~x^~~~~x}. Y así.

Una vez que tengamos la cadena larga, podemos imprimirla en la terminal con \message(y terminar con un \byeTeX se detiene), entonces \message{~~~~~x}\bye. O escriba la expresión resultante (como una fórmula matemática) rodeándola con $s: so $~~~~~x$\bye.

Manuel
fuente
Lo siento si hay algo mal, primero responde aquí.
Manuel
Para una gran n(en lugar de 5) podría ser más eficiente crear una macro que genere una lista de ntildes en ~lugar de escribir ~~~~~. Además, se vería mejor si toda la expresión está compuesta en \scriptscriptstyle.
Manuel
Buen truco ... ¿puedes agregar una explicación, o te importa si agrego una? Esto ilustra una buena característica de la coincidencia de patrones en las macros TeX, que no es una característica común en muchos idiomas (que yo sepa).
ShreevatsaR
Lo agregaré, pero no dudes en editarlo.
Manuel
Vaya, no vi tu comentario ... agregó una explicación muy similar; siéntase libre de rechazar. +1 por la buena respuesta!
ShreevatsaR
4

05AB1E , 17 bytes

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

Pruébalo en línea!

Explicación

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

Otros programas en el mismo conteo de bytes incluyen

"{x^x_x}"©4F'x¡®ý
'x5F'x"{x^x_x}".:
Emigna
fuente
Siento que "{x^x_x}"se puede reducir ._.
Urna de pulpo mágico
4

PowerShell ,  44  35 bytes

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

Pruébalo en línea!

Utiliza la multiplicación de cadenas para repetidamente -replace xes con los sub y scripts, y luego genera la salida.

Guardado 9 bytes gracias a Joey.

AdmBorkBork
fuente
"'x'"+"-replace'x','{x^x_x}'"*5|iexes un poco más fácil, ¿no?
Joey
@ Joey Oh, esa es una forma inteligente de hacerlo. ¡Gracias!
AdmBorkBork
2

MATL ,21 20 bytes

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

-1 byte gracias a Giuseppe

Pruébalo en línea!

Cinaski
fuente
1
20 bytes con 'x'XJ5:"J'{x^x_x}'Zto incluso5pc5:"5pc'{x^x_x}'Zt
Giuseppe
@Giuseppe Gracias!
Cinaski
2

JavaScript (ES6), 45 42 37 bytes

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

Editar: Guardado 3 2 bytes gracias a @Arnauld. Especificar 5 todavía me cuesta 2 bytes; esta versión de 41 40 35 bytes toma un parámetro en su lugar:

f=n=>n?[...'{^_}'].join(f(n-1)):'x'
Neil
fuente
2

Japt , 21 20 18 bytes

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

Pruébalo


Explicación

5Æ             Ã

Genere una matriz de longitud 5 y mapee sobre ella.

"\{^_}"¬

Dividir una cadena en una matriz de caracteres

qUª'x

Vuelva a unir ( q) a una cadena utilizando el valor actual de Uo ( ª) "x".

=

Asigne el resultado de eso a U.

Ì

Obtenga el último elemento en la matriz.


Alternativas, 18 bytes

Igual que el anterior pero reduciendo la matriz después de que se haya creado.

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

Pruébalo

La opción recursiva.

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

Pruébalo

Lanudo
fuente
1

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

Pruébalo en línea!

Roberto Graham
fuente
Creo que es más corto escribir tcomo una función real en lugar de una lambda
Roman Gräf
Si utiliza un programa completo, t.apply(1)debería ser t.apply(new Integer(a[0]))en su lugar. Pero, ¿por qué no simplemente publicar un método? String t(int n){return n>0?t(n-1).replace("x","{x^x_x}"):"x";}Y si el requisito del desafío sería un programa completo (que no lo es), usar un método recursivo de Java 7 sería más corto que una 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 caracteres

Resumiendo 3 mejores respuestas aquí :

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]
Vitaliy Kaurov
fuente
3
No se recomienda responder a su propio desafío, sin dejar a otros un par de días primero.
Sr. Xcoder
1
¿Su primer fragmento de código no requiere 41 bytes?
Jonathan Frech
@ Mr.Xcoder se disculpa, el formulario del editor sugerido como una opción para publicar mi propia respuesta. ¿Debo eliminar mi respuesta?
Vitaliy Kaurov
@VitaliyKaurov Creo que deberías, otros usuarios probablemente recibirán esto mal.
Sr. Xcoder
0

Pyth, 17 16 13 bytes

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

Pruébalo en línea!

Traducción de Python 3:
from functools import*;print(reduce(lambda x,y:x.join(y),["x"]+5*["{^_}"]))
hakr14
fuente