L'ordre des opérations, PEMDAS, est une règle de base en mathématiques nous indiquant quelles opérations d'ordre doivent être effectuées:
"Parenthèses, exposants, multiplication et division, et addition et soustraction"
Le problème est que PEMDAS n'est pas très polyvalent! Et si vous vouliez le faire dans un autre ordre? Nous ne jouerons pas avec les parenthèses, nous les gardons donc là où elles sont (d'abord).
Créez un programme qui prend deux arguments:
- Une chaîne indiquant l'ordre dans lequel les opérations doivent suivre. Quelques exemples sont
"DAMES"
,"SAD, ME"
,"ME SAD"
,"MEADS"
. Oui, les espaces et les virgules sont OK, car cela rend la commande plus facile à retenir.- Suggestions suivantes dans le chat: La prise en charge des espaces et des virgules est désormais facultative.
- Si l'une des lettres est manquante ou s'il y a des lettres supplémentaires qui ne devraient pas s'y trouver, vous pouvez considérer l'entrée comme non valide et la traiter comme vous le souhaitez.
- Une chaîne ou une expression contenant l'expression à évaluer.
Renvoie le résultat de l'expression sous la forme d'un nombre décimal ou d'un entier. Si la réponse n'est pas un entier, elle doit être renvoyée sous forme de nombre décimal.
Règles:
- C'est OK de combiner les deux arguments d'entrée en un seul, si c'est plus facile dans votre langue.
- Ce ne doit pas être une chaîne, mais il doit avoir des lettres. Vous ne pouvez pas remplacer Addition par 1, Division par 2, etc.
- Vous pouvez choisir quelle entrée est la première.
- L'expression est évaluée de
droite à gauche degauche à droite. (Changement de règle. Toute affiche des soumissions des 12 premières heures qui ont ceci dans l'autre sens est acceptée). - Les opérations utilisent les symboles:
( ) ^ * / + -
. Par exemple, vous ne pouvez pas utiliser¤
au lieu de+
pour l'ajout. - Les espaces dans l'expression d'entrée ne sont pas valides comme entrée
- Unaire +/- n'est pas valide comme entrée s'il suit directement + ou -. Considérez
3+-2
comme entrée non valide. Il peut être traité comme vous le souhaitez (ne doit pas produire d'erreur). Si+
ou-
suit tout autre opérateur que plus ou moins, il est traité de la manière habituelle:3*-3 = -9
,sin(-2)=-0.909
- Le programme doit suivre strictement les lettres, donc
"EMDAS", 1-3+4 => -6
, et"EMDSA", 1-3+4 => 2
.
Exemples:
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
Notez que les parenthèses ont été ajoutées pour montrer que la multiplication 4*sin(0.5^2)
est évaluée avant l'exponentiation.
C'est le golf de code, donc le code le plus court en octets gagne.
BODMAS
ouBIDMAS
à l'école.B
= Supports,O
ouI
= Ordre ou Indices.p
nécessaire? Ce n'est pas dans les exemplesRéponses:
JavaScript (ES6) 349
353 387 400... peut-être encore jouable au golf
Cet ancien analyseur est parfois utile - (déjà utilisé dans 2 autres défis)
Non golfé
la source
(t=>t=='('?(z=1, Q.push('_'))
, ainsi que toutes les nouvelles lignes.Math.pow(a,b)
àa**b
R 3.3.2:
209196187177 octetsL'idée est de "mal utiliser" les opérateurs non arithmétiques <, &, |, ~,? où nous connaissons la priorité (voir
?Syntax
dans R - mais avant la substitution;)) et les remplacer avec les opérateurs arithmétiques donnés. Le mappage est conforme à l'ordre des opérations souhaité.Les espaces et les virgules dans l'entrée ne sont pas pris en charge.
Version golfée
Non golfé et commenté:
Exemples:
la source