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 Code-Golf , also gewinnt der kürzeste Code.
Antworten:
Python 2,
656627618 BytesÜbernimmt die Eingabe für STDIN und schreibt die Ausgabe in STDOUT.
Das Programm geht davon aus, dass keine andere Kontrollsequenz als
\frac
,\sum
oder\prod
erscheinen 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\sum
und\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:
Code-Snippet anzeigen
Beispiele:
\frac{-b +- \sqrt{b^2 - 4ac}}{2a}
|v| = \sqrt{ \sum_{i}^{} v[i]^2 }
quelle
\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!LaTeX,
540532 ZeichenHaftungsausschluss: Dies ist nicht perfekt und gilt möglicherweise nicht als gültige Antwort.
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:
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 .
quelle
\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-1ex
zuvor\displaystyle
in Ihre Summe und Produktdefinition einfügen.