Radzenie sobie z równaniami przy braku dobrego edytora równań jest nieuporządkowane i nieprzyjemne. Na przykład, jeśli chciałbym wyrazić całkę i jej rozwiązanie, mogłoby to wyglądać mniej więcej tak:
Całka [x ^ 3 e ^ (- mx ^ 2 b / 2), dx] = - ((2 + b m x ^ 2) / (b ^ 2 * e ^ ((b m x ^ 2) / 2) * m ^ 2))
W witrynie integrals.wolfram.com nazywa się to „formularzem wejściowym”. Nikt nie lubi widzieć równania w „formie wejściowej”. Idealnym sposobem wizualizacji tego równania byłoby:
(Wolfram nazywa to „tradycyjną formą”)
Dla tego kodegolfa napisz program, który weźmie jakieś równanie w „formie wejściowej” jako dane wejściowe i wizualizuj to równanie w postaci ascii „tradycyjnej formy”. W tym przykładzie możemy otrzymać coś takiego:
/\ 3
| x
| ------------ dx =
| 2
\/ (m x b)/2
e
2
2 + b m x
-(-----------------)
2
2 (b m x )/2 2
b e m
Wymagania:
- Nie tasuj, nie upraszczaj ani nie zmieniaj w żaden sposób danych wejściowych. Renderuj go w dokładnie takiej samej formie, w jakiej został opisany przez dane wejściowe.
- Obsługuje cztery podstawowe operacje matematyczne (+, -, *, /). Gdy nie mnożymy dwóch sąsiednich liczb, sugerowany jest symbol * i należy go pominąć.
- Obsługa integracji (jak pokazano w powyższym przykładzie) nie jest wymagana. Możliwość obsługi danych wejściowych za pomocą funkcji takich jak Integrate [...] lub Sqrt [...] to bonus.
- Moce wsparcia, jak pokazano w powyższym przykładzie (n-ty pierwiastek można modelować, podnosząc do 1 / n-tej mocy).
- Nadmiarowe nawiasy (takie jak wokół mianownika i licznika dużej frakcji w powyższym przykładzie) należy pominąć.
- Wyrażenie w mianowniku i liczniku ułamka powinno być wyśrodkowane powyżej i poniżej poziomej linii podziału.
- Możesz wybrać, czy rozpocząć nową linię po znaku równości. W powyższym przykładzie uruchomiono nową linię.
- Kolejność operacji musi być dokładnie taka sama na wyjściu, jak na wejściu.
Kilka przykładów danych wejściowych i powiązanych danych wyjściowych do testowania rozwiązania:
Wejście:
1/2 + 1/3 + 1/4
Wynik:
1 1 1
- + - + -
2 3 4
Wejście:
3x^2 / 2 + x^3^3
Wynik:
2 3
3 x 3
---- + x
2
Wejście:
(2 / x) / (5 / 4^2)
Wynik:
2
-
x
--
5
--
2
4
Wejście:
(3x^2)^(1/2)
Wynik:
2 1/2
(3 x )
Odpowiedzi:
Python 2, 1666 znaków
Układ jest właściwie dość łatwy - to parsowanie danych wejściowych jest królewskim bólem. Nadal nie jestem pewien, czy to całkowicie poprawne.
Za duży wkład w pytanie otrzymuję:
Oto kilka trudniejszych przypadków testowych:
Ten ostatni jest zły, jakiś błąd pierwszeństwa w parserze.
źródło