Kolejność operacji, PEMDAS, jest podstawową zasadą w matematyce, która mówi nam, które operacje kolejności należy wykonać:
„Nawiasy, wykładniki, mnożenie i dzielenie oraz dodawanie i odejmowanie”
Problem w tym, że PEMDAS nie jest bardzo wszechstronny! Co jeśli chcesz to zrobić w innej kolejności? Nie będziemy bałagać się nawiasami, więc trzymamy je tam, gdzie się znajdują (po pierwsze).
Utwórz program, który przyjmuje dwa argumenty:
- Ciąg informujący, w jakiej kolejności powinny się odbywać operacje. Oto kilka przykładów
"DAMES"
,"SAD, ME"
,"ME SAD"
,"MEADS"
. Tak, spacje i przecinki są w porządku, ponieważ ułatwia zapamiętanie kolejności.- Następujące sugestie na czacie: Obsługa spacji i przecinków jest teraz opcjonalna.
- Jeśli brakuje jednej z liter lub istnieją dodatkowe litery, których nie powinno tam być, możesz uznać dane wejściowe za nieprawidłowe i traktować je tak, jak chcesz.
- Ciąg lub wyrażenie zawierające wyrażenie, które należy ocenić.
Zwraca wynik wyrażenia jako liczbę dziesiętną lub liczbę całkowitą. Jeśli odpowiedź nie jest liczbą całkowitą, należy ją zwrócić jako liczbę dziesiętną.
Zasady:
- Można połączyć dwa argumenty wejściowe w jeden, jeśli w twoim języku jest to łatwiejsze.
- Nie musi to być ciąg znaków, ale musi mieć litery. Nie możesz zastąpić dodawania 1, dzielenia 2, itd.
- Możesz wybrać, które wejście jest pierwsze.
- Wyrażenie jest oceniane od
prawej do lewej odlewej do prawej. (Zmiana reguły. Wszelkie zgłoszenia plakat z pierwszych 12 godzin, które mają odwrotnie, są akceptowane). - Operacje użyciu symboli:
( ) ^ * / + -
. Na przykład nie można użyć¤
zamiast+
dodawania. - Spacje w wyrażeniu wejściowym są niepoprawne jako dane wejściowe
- Unary +/- nie jest poprawny jako dane wejściowe, jeśli bezpośrednio następuje po + lub -. Uważaj
3+-2
za nieprawidłowe dane wejściowe. Można to traktować tak, jak chcesz (nie musi powodować błędu). Jeśli+
lub-
następuje żadnego innego operatora niż plus lub minus, jest traktowany w zwykły sposób:3*-3 = -9
,sin(-2)=-0.909
- Program musi ściśle przestrzegać liter, więc
"EMDAS", 1-3+4 => -6
i"EMDSA", 1-3+4 => 2
.
Przykłady:
Input: "EMDAS", "3+6*2/4-1" // -> 3+12/4-1 -> 3+3-1 -> 6-1 -> 5
Output: 5
Input: "DAMES", "3+6*2/4-1" // -> 3+6*0.5-1 -> 9*0.5-1 -> 4.5-1 -> 3.5
Output: 3.5
Input: "SAD, ME", "3+6*2/4-1" // -> 3+6*2/3 -> 9*2/3 -> 9*0.66667 -> 6
Output: 6
Input: "ME ADS", "3+5^4/2-3*2 // -> 3+5^4/2-6 -> 3+625/2-6 -> 628/2-6 -> 314-6 -> 308
Output: 308
Input: "AM EDS", "4*3-sin(0.5^2)*3+1" // -> 4*3-sin(0.5^2)*4 -> 12-sin(0.5^2)*4 -> 4*3-(4*sin(0.5^2)) -> 12-(4*sin(0.5^2)) -> 12-(4*sin(0.25)) -> 12-(4*0.24740) -> 12-0.98961 -> 11.01038
Output: 11.01038
Input: "DAMES", "4-5-6" // -> (4-5)-6 -> = -7
Output: -7 // NOT: -> 4-(5-6) -> 4-(-1) -> 5
Uwaga: nawiasy zostały dodane, aby pokazać, że mnożenie 4*sin(0.5^2)
jest obliczane przed potęgowaniem.
To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach.
BODMAS
lubBIDMAS
w szkole.B
= WspornikiO
lubI
= zamówienie lub indeksy.p
potrzebny? Nie ma tego w przykładachOdpowiedzi:
JavaScript (ES6) 349
353 387 400... może nadal gra w golfa
Ten mój stary parser czasem się przydaje - (już używany w innych 2 wyzwaniach)
Nie golfił
źródło
(t=>t=='('?(z=1, Q.push('_'))
wraz ze wszystkimi nowymi liniami.Math.pow(a,b)
, abya**b
R 3.3.2:
209196187177 bajtówChodzi o to, aby „niewłaściwie używać” nie arytmetycznych operatorów <, &, |, ~,? gdzie znamy pierwszeństwo (patrz
?Syntax
R - ale przed przesłonięciem;)) i zastępowanie ich za pomocą podanych operatorów arytmetycznych. Mapowanie odbywa się zgodnie z pożądaną kolejnością operacji.Spacje i przecinki na wejściu nie są obsługiwane.
Wersja golfowa
Nie golfił i skomentował:
Przykłady:
źródło