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
źródło
eval
uważa się za trywializujący wyzwanie? Czy również formynew Function(...)
liczenia?Odpowiedzi:
JavaScript ES6, 246 bajtów
Jeszcze trochę golfa do zrobienia, ale przynajmniej jest to rozwiązanie!
Nazwij funkcję,
n=>{n=n.split("=")...
aby z niej skorzystać.Hiperbola:
To wykorzystuje podejście przestawne. (Nie jestem pewien, czy tak się nazywa ten algorytm, tylko nazwa, którą wymyśliłem.) Najpierw zbiera kierunek, którego należy szukać od zera (tj. W którą stronę przecinają się zbocza dwóch boków równań) i szuka wartości. Gdy znajdzie punkt minimalnej różnicy, przechodzi do tego punktu i zmniejsza przyrost wyszukiwania. To ostatecznie daje tak precyzyjne rozwiązanie, jakiego potrzebujemy.
źródło
JavaScript (Node.js) ,
10693 bajtówWypróbuj online!
-13 bajtów dzięki @tsh
Nie golfowany:
Wyjaśnienie:
To rozwiązanie działa według metody Newtona w celu znalezienia korzeni. Kod odejmuje prawą stronę równania od lewej strony, tak, że kiedy
f(x)=0
,x
będzie równy wartości, którą rozwiązujemy. Dlatego, gdy znajdziemy źródło tej nowej funkcji, będzie to nasza pożądanax
wartość. Następnie znajduje pochodnąf'(x)
, znajdując nachylenie między dwoma punktami funkcji. Następnie wartości te są po prostu włożony do metody Newtona, który stanowi, dla zbliżenia korzeniax
,x=x-(f(x)/f'(x))
(w kodzie używamy 0 jako początkowejx
wartości). Ponieważ znajduje to korzenie, znajduje nasząx
wartość. Ponieważ gwarantuje się, że równanie jest liniowe, przybliżenie będzie dokładne.źródło
Mathcad, [używa wbudowanego]
Mathcad ma dwie wbudowane metody rozwiązywania takich równań:
Solver symboliczny jest całkiem zadowolony z y = x i zwraca rozwiązanie x = y.
Dla tych, którzy nie znają Mathcada, poniższe zdjęcie pochodzi bezpośrednio ze skoroszytu WYSIWYGish Mathcad 15. Zmiana dowolnego wyrażenia, w którym są zapisane, spowoduje, że Mathcad ponownie oceni odpowiedź i odpowiednio zaktualizuje wyświetlacz.
źródło
Axiom, 214 bajtów [wykorzystuje wbudowany]
W przypadku niektórych błędów zwraca% i, w przypadku innych błędów funkcja jest zatrzymywana z systemu, coś innego jak 1--2 wydaje się nie na języku ... test:
źródło