Genera TeX per comporre il frattale triangolare Sierpinski


30

Sfida

Scrivi il codice che genera il codice di equazione matematica TeX (LaTeX) (indicato di seguito) che comporterà Sierpinski Triangle Fractal di 5 livelli. Il codice più corto vince .

Dettagli

TeX (e amici come LaTeX, ecc.) È un sofisticato sistema di composizione. Può rendere espressioni complesse nidificate arbitrarie per formule matematiche. Per coincidenza, questo "complesso nidificato" è anche descrittivo dei frattali. Il seguente è reso con MathJaX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

dal seguente codice di equazione matematica in testo semplice costituito da super e sub-script nidificati:

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

Nota che si tratta solo di un annidamento a 5 livelli. Non è necessario generare $...$o $$...$$altri markup richiesti per avviare / terminare un'equazione matematica in TeX & Co. È possibile visualizzare l'anteprima di TeX generato in molti editor online, ad esempio: http://www.hostmath.com ma è possibile trovarne molti anche altri. Questa domanda è stata ispirata da una discussione con gli amici .

Aggiornare

C'è una domanda simile, ma molto più generale e produrrà soluzioni diverse. Volevo vedere la complessità davvero kolmogorov per un codice semplice molto fisso che in un sistema (TeX) è completamente esplicito mentre in un altro compresso. Questo affronta anche il ncommento invece di 5 livelli.


2
Ciao; Ho chiuso la tua domanda come duplicata perché credo che le risposte possano essere modificate in modo troppo banale dall'altra domanda per rispondere a questa domanda. Tuttavia, mi piace l'idea e penso che sia davvero bella! :)
HyperNeutrino,

2
Per quello che vale, ho riaperto questa domanda in quanto non vedo il codice come banalmente modificabile da tradurre dall'uno all'altro.
AdmBorkBork,

4
Questo è di gran lunga troppo veloce per essere accettare una soluzione!
Shaggy,


2
Quando ho visto questa sfida, mi è venuta in mente questa risposta ... codegolf.stackexchange.com/a/6830/67961 e ... era tua
J42161217

Risposte:




14

TeX semplice, 29 byte

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

Ciò produce ciò che altri hanno prodotto. Ma se abbiamo bisogno che il codice sia compilabile sarebbe di 6 byte in più

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

Spiegazione

~è un personaggio attivo in TeX, quindi possiamo dargli una (nuova) definizione.

\def~#1x{{#1x_#1x^#1x}}definisce ~come una macro, in modo che quando TeX vede ~, fa quanto segue:

  • Leggi tutto fino al prossimo xe chiamalo #1(pattern-matching).
  • Sostituisci il tutto con {#1x_#1x^#1x}

Ad esempio, ~ABCxverrebbe sostituito con {ABCx_ABCx^ABCx}.

Quando ~~~~~xviene utilizzato, lo #1è ~~~~, quindi l'intera cosa viene sostituita con {~~~~x_~~~~x^~~~~x}. E così via.

Una volta che abbiamo la stringa lunga, possiamo stamparla sul terminale con \message(e termina con un \byecosì TeX si ferma), quindi \message{~~~~~x}\bye. Oppure componi l'espressione risultante (come una formula matematica), circondandola in $s: so $~~~~~x$\bye.


Scusa se c'è qualcosa di sbagliato, prima risposta qui.
Manuel,

Per un grande n(piuttosto che 5) potrebbe essere più efficiente creare una macro che genera un elenco di ntilde ~anziché scrivere ~~~~~. Inoltre sarebbe meglio se l'intera espressione è composta sotto \scriptscriptstyle.
Manuel,

Bel trucco ... puoi aggiungere una spiegazione, o ti dispiace se ne aggiungo una? Ciò illustra una bella caratteristica della corrispondenza dei motivi nelle macro TeX, che non è una caratteristica comune a molte lingue (che io conosco).
ShreevatsaR,

Lo aggiungerò, ma sentiti libero di modificarlo.
Manuel,

Oops, non ho visto il tuo commento ... ha aggiunto una spiegazione molto simile; sentiti libero di rifiutare. +1 per la bella risposta!
ShreevatsaR,

4

05AB1E , 17 byte

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

Provalo online!

Spiegazione

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

Altri programmi con lo stesso numero di byte includono

"{x^x_x}"©4F'x¡®ý
'x5F'x"{x^x_x}".:

Sento che "{x^x_x}"può essere ridotto ._.
Magic Octopus Urn,

4

PowerShell ,  44  35 byte

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

Provalo online!

Usa la moltiplicazione delle stringhe per -replace xesitare ripetutamente con i sub-e super-script, quindi l'output.

Salvataggio di 9 byte grazie a Joey.


"'x'"+"-replace'x','{x^x_x}'"*5|iexè un po 'più facile, no?
Joey,

@Joey Oh, è un modo intelligente di farlo. Grazie!
AdmBorkBork,


2

JavaScript (ES6), 45 42 37 byte

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

Modifica: salvato 3 2 byte grazie a @Arnauld. Specificare 5 mi costa ancora 2 byte; questa versione 41 40 35 byte accetta invece un parametro:

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



2

Japt , 21 20 18 byte

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

Provalo


Spiegazione

5Æ             Ã

Genera un array di lunghezza 5 e mappalo su di esso.

"\{^_}"¬

Dividi una stringa in una matrice di caratteri

qUª'x

Ricongiungere ( q) a una stringa usando il valore corrente di Uo ( ª) "x".

=

Assegna il risultato a quello U.

Ì

Ottieni l'ultimo elemento dell'array.


Alternative, 18 byte

Come sopra ma riducendo l'array dopo che è stato creato.

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

Provalo

L'opzione ricorsiva.

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

Provalo


1

Java (OpenJDK 8) , 179 167 byte

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

Provalo online!


Penso che sia più breve scrivere tcome una vera funzione invece che come una lambda
Roman Gräf,

Se si utilizza un intero programma, t.apply(1)dovrebbe essere t.apply(new Integer(a[0]))invece. Ma perché non pubblicare un metodo? String t(int n){return n>0?t(n-1).replace("x","{x^x_x}"):"x";}E se il requisito della sfida fosse un programma completo (che non lo è), l'utilizzo di un metodo ricorsivo Java 7 sarebbe più breve di un 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 caratteri

Riassumendo 3 migliori risposte qui :

40 byte:

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

41 byte:

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

44 byte:

Last@SubstitutionSystem["x"->"{x^x_x}","x",5]

3
Non è consigliabile rispondere alla propria sfida, senza lasciare prima gli altri un paio di giorni.
Mr. Xcoder,

1
Il tuo primo frammento di codice non richiede 41 byte?
Jonathan Frech,

@ Mr.Xcoder si scusa, il modulo dell'editor ha suggerito come un'opzione per pubblicare la mia risposta. Devo cancellare la mia risposta?
Vitaliy Kaurov,

@VitaliyKaurov Penso che dovresti, altri utenti probabilmente lo riceveranno male.
Mr. Xcoder,


0

Pyth, 17 16 13 byte

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

Provalo online!

Traduzione di Python 3:
from functools import*;print(reduce(lambda x,y:x.join(y),["x"]+5*["{^_}"]))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.