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.


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


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.


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}".:

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.


"'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

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'



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


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!


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]

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*["{^_}"]))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.