To wyzwanie, ale z lepszą specyfikacją.
Spec
Twój program weźmie równanie liniowe zawierające jedną zmienną x
i wyświetli wartość x
.
Wejście / parsowanie
- Dane wejściowe będą zawierać tylko liczby, operatory, nawiasy (
()
)x
i=
znak (oznacza to brak białych znaków). - Nawiasy zawsze będą zrównoważone.
- Zawsze będzie co najmniej 1
x
.x
Może być poprzedzona numerem. - Wszystkie równania będą miały dokładnie jeden wynik.
Liczba może być zdefiniowana przez następujące kroki. Wiele może być określony przez regex: -?(\d+(\.\d+)?|\.\d+)
.
Jeśli nie mówisz wyrażenia regularnego: cyfra jest zdefiniowana jako 0-9
- Na początku może mieć wartość
-
ujemną - Wtedy mogą być jakieś cyfry. Jeśli nie są to żadne cyfry, będzie kropka dziesiętna
- Jeśli istnieje przecinek dziesiętny, za nim podąża co najmniej jedna cyfra
Największa liczba / wartość będzie określona przez możliwości twojego języka.
Operator jest którykolwiek z: +-*/
, zawsze będą pojawiać się między numerami, i czy nawias
oznacza (5)(5)
to, że nie jest to poprawny wkład ze względu na prostotę.
Nawias zawsze będzie zawierał prawidłowe wyrażenie (poprawną kombinację liczb i / lub operatorów). Nawias „zrównoważony” jest zdefiniowany, ponieważ każdy (
będzie miał powiązane zamknięcie)
Ocena
- Kolejność operacji powinna być przestrzegana, a priorytety są (od najwyższego do najniższego):
- Nawias (najpierw najgłębiej zagnieżdżony)
- Mnożenie i dzielenie
- Dodawanie odejmowanie
- Jeśli wystąpią dwa operatory o tym samym priorytecie, powinieneś woli iść w lewo -> w prawo
Wynik
Powinieneś w jakiś sposób wypisać wynik. Jeśli nie podajesz tylko wyniku liczbowego, wyjaśnij w swojej odpowiedzi, w jaki sposób generowany jest wynik. Twój format wyjściowy powinien być spójny. Dane wyjściowe mogą być dziesiętne, ale zawsze będą racjonalne, precyzja jest ograniczona do precyzji twojego języka. Tylko jeśli twój język nie obsługuje arytmetyki zmiennoprzecinkowej, nie musisz jej obsługiwać.
Zasady
- Wbudowane trywializujące to zadanie są dozwolone, ale należy wyraźnie dodać
[uses built-in]
wyraźnie nagłówek odpowiedzi. To zwalnia twoją odpowiedź od wygranej - „Wbudowane trywializujące to zadanie” to:
- Coś, co przyjmuje równanie i wyświetla wartość dla zmiennej /
- Coś, co całkowicie uprości równanie
- Użycie
eval
lub powiązanej funkcji do wykonania znacznej ilości parsowania. Korzystanie zeval
funkcji pokrewnych jest niedozwolone, jeśli są one używane (przy minimalnej modyfikacji danych wejściowych) do rozwiązywania równań liniowych. - Jeśli masz wątpliwości, po prostu zapytaj w komentarzu.
- Dozwolone są wbudowane parsujące równanie
Przykłady
3+4=x
7
4+x=5
1
3+3*3=x
12
3x-4=7+2x
11
3--1=x
4
3*(2+4x)=7x-4
-2
1.2+2.3x=5.8
2
10=4x
2.5
NIEPRAWIDŁOWE Wejścia:
(5)(4)=x no operator between (5) and (4)
5(x+3)=2 no operator 5 and (...)
x=y the only variable is x
4=3 there is no x
x+3=x-7 no solution
x=x infinite solutions
+5=x + is not an unary operator. -5=x would be valid though
1/(x-3)=5 Nonlinear
3/x Nonlinear
eval
uważa się za trywializujący wyzwanie? Czy również formy new Function(...)
liczenia?