El orden de las operaciones, PEMDAS, es una regla básica en matemáticas que nos dice qué operaciones de orden deben realizarse:
"Paréntesis, exponentes, multiplicación y división, y suma y resta"
El problema es que PEMDAS no es muy versátil. ¿Y si quisieras hacerlo en otro orden? No nos meteremos con los paréntesis, por lo que los mantenemos donde están (primero).
Cree un programa que tome dos argumentos:
- Una cadena que indica en qué orden deben seguir las operaciones. Algunos ejemplos son
"DAMES"
,"SAD, ME"
,"ME SAD"
,"MEADS"
. Sí, los espacios y las comas están bien, ya que hace que el orden sea más fácil de recordar.- Siguiendo las sugerencias en el chat: los espacios de apoyo y las comas ahora son opcionales.
- Si falta una de las letras, o si hay letras adicionales que no deberían estar allí, puede considerar que la entrada no es válida y tratarla como desee.
- Una cadena o una expresión que contiene la expresión que debe evaluarse.
Devuelve el resultado de la expresión como un número decimal o un entero. Si la respuesta no es un número entero, debe devolverse como un número decimal.
Reglas:
- Está bien combinar los dos argumentos de entrada en uno, si eso es más fácil en su idioma.
- No tiene que ser una cadena, pero debe tener letras. No puedes sustituir Adición con 1, División con 2, etc.
- Puede elegir qué entrada es primero.
- La expresión se evalúa de
derecha a izquierda deizquierda a derecha. (Cambio de regla. Cualquier póster de envío de las primeras 12 horas que tenga esto al revés es aceptado) - Las operaciones utilizan los símbolos:
( ) ^ * / + -
. Por ejemplo, no puede usar en¤
lugar de+
para sumar. - Los espacios en la expresión de entrada no son válidos como entrada
- Unario +/- no es válido como entrada si sigue directamente a + o -. Considerar
3+-2
como entrada no válida. Se puede tratar como quiera (no tiene que producir un error). Si+
o-
sigue cualquier otro operador que más o menos, se trató de la forma habitual:3*-3 = -9
,sin(-2)=-0.909
- El programa debe seguir estrictamente las letras, así
"EMDAS", 1-3+4 => -6
, y"EMDSA", 1-3+4 => 2
.
Ejemplos:
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
Tenga en cuenta que los paréntesis se agregaron para mostrar que la multiplicación 4*sin(0.5^2)
se evalúa antes de la exponenciación.
Este es el código de golf, por lo que gana el código más corto en bytes.
BODMAS
oBIDMAS
en la escuela.B
= Paréntesis,O
oI
= Orden o Índices.p
necesario? No está en los ejemplosRespuestas:
JavaScript (ES6) 349353387
400... tal vez todavía golfable
Este viejo analizador mío a veces es útil - (ya usado en otros 2 desafíos)
Sin golf
fuente
(t=>t=='('?(z=1, Q.push('_'))
, junto con todas las líneas nuevas.Math.pow(a,b)
aa**b
R 3.3.2:
209196187177 bytesLa idea es "mal uso" de los operadores no aritméticos <, &, |, ~,? donde sabemos la precedencia (ver
?Syntax
en R - pero antes de la anulación;)) y anularlos con los operadores aritméticos dados. El mapeo se realiza según el orden deseado de operaciones.No se admiten espacios ni comas en la entrada .
Versión de golf
Ungolfed y comentó:
Ejemplos:
fuente