Die Reihenfolge der Operationen, PEMDAS, ist eine Grundregel in der Mathematik, die uns sagt, welche Ordnungsoperationen ausgeführt werden sollen:
"Klammern, Exponenten, Multiplikation und Division sowie Addition und Subtraktion"
Das Problem ist, dass PEMDAS nicht sehr vielseitig ist! Was wäre, wenn Sie es in einer anderen Reihenfolge tun wollten? Wir werden uns nicht mit den Klammern anlegen, also behalten wir sie (zuerst) dort, wo sie sind.
Erstellen Sie ein Programm mit zwei Argumenten:
- Ein String, der angibt, in welcher Reihenfolge die Operationen ausgeführt werden sollen. Einige Beispiele sind
"DAMES"
,"SAD, ME"
,"ME SAD"
,"MEADS"
. Ja, Leerzeichen und Kommas sind in Ordnung, da die Reihenfolge dadurch leichter zu merken ist.- Folgende Vorschläge im Chat: Die Unterstützung von Leerzeichen und Kommas ist jetzt optional.
- Wenn einer der Buchstaben fehlt oder zusätzliche Buchstaben fehlen sollten, können Sie die Eingabe als ungültig betrachten und sie so behandeln, wie Sie möchten.
- Eine Zeichenfolge oder ein Ausdruck, der den Ausdruck enthält, der ausgewertet werden soll.
Gibt das Ergebnis des Ausdrucks entweder als Dezimalzahl oder als Ganzzahl zurück. Wenn die Antwort keine Ganzzahl ist, muss sie als Dezimalzahl zurückgegeben werden.
Regeln:
- Es ist in Ordnung, die beiden Eingabeargumente zu einem zu kombinieren, wenn dies in Ihrer Sprache einfacher ist.
- Es muss keine Zeichenfolge sein, aber es muss Buchstaben haben. Sie können Addition nicht durch 1, Division durch 2 usw. ersetzen.
- Sie können wählen, welcher Eingang zuerst ist.
- Der Ausdruck wird von
rechts nach links vonlinks nach rechts ausgewertet . (Änderung der Regel. Alle Einsendungen von Postern in den ersten 12 Stunden, bei denen dies umgekehrt ist, werden akzeptiert.) - Die Operationen verwenden Sie die Symbole:
( ) ^ * / + -
. Zum Beispiel können Sie nicht¤
statt+
zum Hinzufügen verwenden. - Leerzeichen im Eingabeausdruck gelten nicht als Eingabe
- Unary +/- ist nicht als Eingabe gültig, wenn es direkt auf + oder - folgt. Als
3+-2
ungültige Eingabe betrachten. Es kann behandelt werden, wie Sie möchten (es muss kein Fehler vorliegen). Wenn+
oder-
anderen Operator folgt als plus oder minus, ist es die übliche Art und Weise behandelt:3*-3 = -9
,sin(-2)=-0.909
- Das Programm muss die Buchstaben streng folgen, so
"EMDAS", 1-3+4 => -6
, und"EMDSA", 1-3+4 => 2
.
Beispiele:
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
Beachten Sie, dass die Klammern hinzugefügt wurden, um anzuzeigen, dass die Multiplikation 4*sin(0.5^2)
vor der Exponentiation ausgewertet wird.
Das ist Code Golf, also gewinnt der kürzeste Code in Bytes.
BODMAS
oderBIDMAS
in der Schule unterrichtet.B
= KlammernO
oderI
= Reihenfolge oder Indizes.p
gebraucht Es ist nicht in den BeispielenAntworten:
JavaScript (ES6) 349
353 387 400... vielleicht noch golfen
Dieser alte Parser von mir ist manchmal praktisch - (bereits in anderen 2 Herausforderungen verwendet)
Ungolfed
quelle
(t=>t=='('?(z=1, Q.push('_'))
zusammen mit allen Zeilenumbrüchen entfernen.Math.pow(a,b)
zu änderna**b
R 3.3.2:
209196187177 BytesDie Idee ist, die nicht-arithmetischen Operatoren <, &, |, ~,? wo wir den Vorrang kennen (siehe
?Syntax
in R - aber vor dem Überschreiben;)) und sie mit den gegebenen arithmetischen Operatoren überschreiben. Die Zuordnung erfolgt in der gewünschten Reihenfolge.Leerzeichen und Kommas in der Eingabe werden nicht unterstützt.
Golf Version
Ungolfed und kommentiert:
Beispiele:
quelle