A ordem das operações, PEMDAS, é uma regra básica em matemática, indicando-nos quais operações de ordem devem ser executadas:
"Parênteses, expoentes, multiplicação e divisão e adição e subtração"
O problema é que o PEMDAS não é muito versátil! E se você quisesse fazê-lo em outra ordem? Não vamos mexer com os parênteses, então os mantemos onde estão (primeiro).
Crie um programa que aceite dois argumentos:
- Uma cadeia de caracteres, informando qual ordem as operações devem seguir. Alguns exemplos são
"DAMES"
,"SAD, ME"
,"ME SAD"
,"MEADS"
. Sim, espaços e vírgulas estão OK, pois facilita a lembrança do pedido.- Seguintes sugestões no bate-papo: O suporte a espaços e vírgulas agora é opcional.
- Se uma das letras estiver faltando ou se houver mais letras que não deveriam estar lá, você poderá considerar a entrada inválida e tratá-la como desejar.
- Uma sequência ou expressão que contém a expressão que deve ser avaliada.
Retorne o resultado da expressão como um número decimal ou um número inteiro. Se a resposta não for um número inteiro, ela deverá ser retornada como um número decimal.
Regras:
- Não há problema em combinar os dois argumentos de entrada em um, se isso for mais fácil no seu idioma.
- Não precisa ser uma string, mas precisa ter letras. Você não pode substituir Adição por 1, Divisão por 2, etc.
- Você pode escolher qual entrada é a primeira.
- A expressão é avaliada da
direita para a esquerda, daesquerda para a direita. (Alteração de regra. Todos os pôsteres de envios nas primeiras 12 horas que tiverem o contrário serão aceitos). - As operações de utilizar os símbolos:
( ) ^ * / + -
. Por exemplo, você não pode usar em¤
vez de+
adicionar. - Os espaços na expressão de entrada não são válidos como entrada
- Unário +/- não é válido como entrada se seguir diretamente + ou -. Considere
3+-2
como entrada inválida. Ele pode ser tratado da maneira que você desejar (não precisa gerar um erro). Se+
ou-
segue qualquer outro operador que mais ou menos, ela é tratada da forma usual:3*-3 = -9
,sin(-2)=-0.909
- O programa deve seguir rigorosamente as letras, então
"EMDAS", 1-3+4 => -6
, e"EMDSA", 1-3+4 => 2
.
Exemplos:
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
Observe que os parênteses foram adicionados para mostrar que a multiplicação 4*sin(0.5^2)
é avaliada antes da exponenciação.
Este é o código golf, portanto o código mais curto em bytes vence.
BODMAS
ouBIDMAS
na escola.B
= ColchetesO
ouI
= ordem ou índices.p
necessário? Não está nos exemplosRespostas:
JavaScript (ES6) 349
353 387 400... talvez ainda jogável
Este antigo analisador meu às vezes é útil - (já usado em outros 2 desafios)
Ungolfed
fonte
(t=>t=='('?(z=1, Q.push('_'))
, junto com todas as novas linhas.Math.pow(a,b)
paraa**b
R 3.3.2:
209196187177 bytesA idéia é "abusar" dos operadores não aritméticos <, &, |, ~,? onde sabemos a precedência (veja
?Syntax
em R - mas antes da substituição;)) e substituindo-as pelos operadores aritméticos fornecidos. O mapeamento está de acordo com a ordem de operações desejada.Espaços e vírgulas na entrada não são suportados.
Versão Golfed
Ungolfed e comentou:
Exemplos:
fonte