LaTeX des armen Mannes

37

Sie werden in ein Paralleluniversum transportiert, in dem Menschen mathematische Gleichungen als ASCII-Kunst von Hand auf Computern schreiben. Als LaTeX-Süchtiger ist dies völlig inakzeptabel, und Sie sollten diesen Prozess etwas automatisieren.

Ihr Ziel ist es, ein Programm zu schreiben, das eine ASCII-Version einer als LaTeX-Mathematikbefehl eingegebenen Gleichung ausgibt.

Obligatorische zu unterstützende LaTeX-Befehle

  • Summe: Der LaTeX-Befehl für eine Summe lautet \sum_{lower bound}^{upper bound}

    Die ASCII-Zahl, die Sie für Summen verwenden müssen, lautet:

    upper bound
        ___ 
        \  `
        /__,
    lower bound
    
  • Produkt: Der LaTeX-Befehl für ein Produkt lautet \prod_{lower bound}^{upper bound}

    Die ASCII-Zahl, die Sie für Produkte verwenden müssen, lautet:

    upper bound
        ____
        |  |
        |  |
    lower bound
    
  • Bruch: Der LaTeX-Befehl für Brüche lautet \frac{numerator}{denominator}

    Die ASCII-Zahl, die Sie für Brüche verwenden müssen, lautet:

     numerator
    -----------
    denominator
    

Alles, was nicht zu diesen drei Befehlen gehört, wird so angezeigt, wie es ist. Beispielsweise \sum{i=3}^{e^10}\frac{3x+5}{2}sollte angezeigt werden als

e^10
___  3x+5
\  ` ----
/__,  2
i=3

Eingänge

Die Eingabe ist ein LaTeX-Befehl, der als Zeichenfolge übergeben wird (oder Ihre Sprache entspricht Zeichenfolgen). LaTeX-Befehle können verschachtelt sein, zum Beispiel \frac{\frac{1}{2}}{3}ist eine gültige Eingabe. Eingaben sollten immer korrekt sein (es ist nicht erforderlich, die LaTeX-Syntax in Ihrem Code zu überprüfen). Eingaben bestehen nur aus den drei oben aufgeführten LaTeX-Befehlen und 'Text', den Sie nicht formatieren müssen.

LaTeX-Befehle werden immer mit der oben angegebenen Syntax geliefert, dh Summen und Produkte haben immer obere und untere Schranken (obwohl sie leer sein können) und es wird immer einen Zähler und Nenner für Brüche geben.

Wir gehen davon aus, dass die Grenzen von Summen und Produkten höchstens 4 Zeichen lang sind (= die Breite der Summen- und Produktsymbole), damit Sie sich nicht über mögliche Überlappungsprobleme Gedanken machen müssen. Aus ähnlichen Gründen nehmen wir an, dass die Grenzen nur 'Text' sind und niemals LaTeX-Befehle sein werden, z. B. \sum_{\sum_{1}^{2}}^{1}ist keine gültige Eingabe.

Ausgänge

Die Ausgabe Ihres Programms ist die ASCII-Darstellung des LaTeX-Befehls, den Sie als Eingabe erhalten haben.

Ihr Programm muss die horizontale Ausrichtung berücksichtigen: Beispielsweise müssen die Grenzen der Summe oder des Produkts horizontal an dem Symbol für die Summe oder das Produkt ausgerichtet sein (beide sind 4 Zeichen breit). Wenn die Grenze eine ungerade Anzahl von Zeichen enthält, spielt es keine Rolle, ob es sich um ein Zeichen rechts oder links von der Mitte handelt, je nachdem, was in Ordnung ist. Die Bruchlinie muss so lang sein wie der Zähler oder der Nenner, je nachdem, welcher der längste ist.

Ihr Programm muss die vertikale Ausrichtung berücksichtigen: Beispielsweise \frac{\frac{1}{2}}{3} = \frac{1}{6}sollte angezeigt werden als

1
-
2   1
- = -
3   6

Bei Summen und Produkten wird angenommen, dass die vertikale Mitte die zweite Zeile von oben ist, da die Symbole 4 Zeichen hoch sind.

Der horizontale Abstand wird in der angegebenen Eingabe als korrekt angenommen, dh die Leerzeichen in der Eingabe sollten in der Ausgabe angezeigt werden.

Testfälle

  • Eingang abc = 2

    Ausgabe abc = 2

  • Eingang e = \sum_{n=0}^{+inf} \frac{1}{n!}

    Ausgabe

        +inf
        ___  1
    e = \  ` --
        /__, n!
        n=0
    
  • Eingang e^x = 1 + \frac{x}{1 - \frac{x}{2 + x - ...}}

    Ausgabe

                     x
    e^x = 1 + ---------------
                       x
              1 - -----------
                  2 + x - ...
    
  • Eingang \prod_{i=1}^{n} \frac{\sum_{j=0}^{m} 2j}{i + 1}

    Ausgabe

           m
          ___
          \  ` 2j
     n    /__,
    ____  j=0
    |  |  -------
    |  |   i + 1
    i=1
    
  • Eingang \frac{sum}{prod} = \sum_{frac}^{prod} sum

    Ausgabe

           prod
    sum    ___
    ---- = \  ` sum
    prod   /__,
           frac
    

Wertung

Das ist , also gewinnt der kürzeste Code.

Tödlich
quelle
11
Schöne erste Herausforderung. Es sieht ziemlich schwierig aus; Ich bin gespannt auf einige Lösungen.
Alex A.
1
@ Alex A. Ich wollte ursprünglich auch Integrale, Quadratwurzeln und erweiterbare Klammern haben, aber das schien ein bisschen zu viel ...
Fatalize
2
Ich glaube, es wird Fälle geben, in denen es zu Überschneidungen kommt. Wenn Sie beispielsweise eine Summe haben, bei der der Term größer als 4 ist (z. B. mehrere Brüche, Brüche von Summen) und die Summe eine lange Ober- / Untergrenze hat, kann sich die Ober- / Untergrenze mit dem Term überschneiden. Wie würde das gelöst werden? Muss der Term von der Summe getrennt sein, um eine Überschneidung mit den Grenzen zu vermeiden?
Reto Koradi
8
Ich hoffe wirklich, dass jemand eine Lösung in LaTeX findet
shadowtalker 27.06.15

Antworten:

23

Python 2, 656 627 618 Bytes

M=max
O=lambda l,o=2:[(p+o,c)for p,c in l]
def C(s,m=0):
 if''<s<'}'[m:]:f,w,h,d,s=C(s,1);F,W,H,D,s=C(s);e=M(d,D);return[O(f,e-d)+O(F,w*1j+e-D),w+W,M(h-d,H-D)+e,e,s]
 if'\\'!=s[:1]:return[[(0,s[:1])]*m,m,m,0,s[1:]]
 t=s[1]<'s';e=s[1]>'f';f,w,h,d,s=C(s[5+t+e:]);F,W,H,D,s=C(s[1+e:]);g=M(w,W);G=C('-'*g)[0]
 if e:f,w,h,F,W,H=F,W,H,f,w,h;g=4;p=C('|  |')[0];G=C('_'*(3+t))[0]+[O(C('/__,')[0])+[(1,'\\'),(1+3j,'`')],O(p,1)+O(p)][t]
 x=M(w,W,g);return[O(f,(x-w)/2*1j)+O(F,(x-W)/2*1j+h+3**e)+O(G,(x-g)/2*1j+h),x,h+3**e+H,h+e,s]
f,w,h,d,s=C(raw_input())
for y in range(h):print"".join(dict(f).get(y+x*1j,' ')for x in range(w))

Übernimmt die Eingabe für STDIN und schreibt die Ausgabe in STDOUT.

Das Programm geht davon aus, dass keine andere Kontrollsequenz als \frac, \sumoder \proderscheinen im Eingang (dh, es wird nicht als normaler Text zeigen,) und dass ~scheint nicht so gut (es hat eine besondere Bedeutung in der Mathematik - Modus sowieso.) Auf dem Andererseits seits~~POS=HEADCOMP wird das Programm tut beliebige Formeln als Grenzen Unterstützung für \sumund \prod.

Erläuterung

Es funktioniert genauso wie TeX! (na ja, irgendwie ...) Jede Teilformel (angefangen von einzelnen Zeichen bis hin zu komplexeren Formeln) wird in eine Box mit zugehöriger Breite, Höhe und Tiefe (Grundlinie) umgewandelt. Felder mit einfacheren Formeln werden zu größeren Feldern kombiniert, um komplexe Formeln usw. zu bilden. Der Inhalt jeder Box wird als Liste von Position / Zeichen-Paaren relativ zur linken oberen Ecke der Box dargestellt. Wenn Kästchen zu einem größeren Kästchen kombiniert werden, werden die Positionen entsprechend den relativen Positionen der kleineren Kästchen innerhalb des größeren Kästchens verschoben und die Listen werden verkettet.

Schließlich erhalten wir eine Box der obersten Ebene, die in eine druckbare Form umgewandelt wird.


Um es ein wenig aufzupeppen, unterstützt die folgende Version auch Quadratwurzeln:

Beispiele:

  • \frac{-b +- \sqrt{b^2 - 4ac}}{2a}

            _________
    -b +- \/b^2 - 4ac
    -----------------
           2a
    
  • |v| = \sqrt{ \sum_{i}^{} v[i]^2 }

               _____________
              / ___
    |v| =    /  \  ` v[i]^2
            /   /__,
          \/     i
    
Ell
quelle
9
Ich muss sagen, dass ich sehr beeindruckt bin! Versuchte zu laufen \prod_{i=1}^{\sum_{azededzeda}^{k}} \frac{\sum_{j=0}^{m} 2j}{i + 1}und gab alles korrekt ohne Überlappung aus, obwohl es nicht erforderlich war. Nett!
Fatalize
4
Und Sie unterstützen Quadratwurzeln mit nur ~ 18% mehr Bytes. Jemand hält diesen Mann auf!
Fatalize
1
@All Das macht Sinn! Gute Arbeit :)
Kade
22

LaTeX, 540 532 Zeichen

Haftungsausschluss: Dies ist nicht perfekt und gilt möglicherweise nicht als gültige Antwort.

\ usepackage [LGRgreek] {mathastext}
\ renewcommand {\ sum} {\ kern-1ex \ displaystyle \ mathop {\ vphantom {\ int} \ begin {array} {l} \ mbox {\ underline {\ hspace {12pt}} \\ \ mbox {\ textbackslash } \ hSpace {8pt} `\\\ mbox {/ \ underline {\ hSpace {8pt}},} \ end {array}} \ displaylimits}
\ renewcommand {\ prod} {\ kern-1ex \ displaystyle \ mathop {\ vphantom {\ int} \ begin {array} {c} \ mbox {\ underline {\ hspace {16pt}} \\ | \ \ \ \ | \\ | \ \ \ \ | \ end {array}} \ displaylimits}
\ renewcommand {\ frac} [2] {\ mathop {\ xleaders \ hbox {-} \ hfill \ kern0pt} \ limits ^ {# 1} _ {# 2}}
\ DeclareMathSizes {10} {10} {10} {10}

Einige Hilfestellungen von @Fatalize finden Sie in den Kommentaren.

Prüfung:

Eingang: \prod_{i=1}^{n} \frac{\sum_{j=0}^{m} 2j}{i + 1}

Ausgabe:

Bildbeschreibung hier eingeben

Wie Sie sehen, entspricht die Ausgabe nicht genau der Spezifikation. Dies kann meine Antwort disqualifizieren, aber ich denke immer noch, dass es sich lohnt, etwas zu posten.

Ich habe das auf sharelatex.com geschrieben. Sie können mit ihm spielen hier .

sudo rm -rf Schrägstrich
quelle
1
Nett! Ich habe ein bisschen mit Ihrem Code gespielt und ich denke, Sie können alles korrigieren \newcommand{\frac}[2]{\mathop{\xleaders\hbox{-}\hfill\kern0pt}\limits^{#1}_{#2}}, indem Sie Ihren Bruch in ändern , danach hinzufügen \DeclareMathSizes{10}{10}{10}{10}(um zu verhindern, dass LaTeX Zähler und Nenner verkleinert) und \kern-1exzuvor \displaystylein Ihre Summe und Produktdefinition einfügen.
Fatalize