Code Golf: valutatore di espressioni matematiche (che rispetta PEMDAS)

Vi sfido a scrivere un valutatore di espressioni matematiche che rispetti PEMDAS (ordine delle operazioni: parentesi, elevazione a potenza, moltiplicazione, divisione, addizione, sottrazione) senza usare le espressioni regolari, una funzione pre-esistente “Eval ()”, una libreria di analisi , eccetera.

Ho visto una sfida valutatore preesistente su SO ( qui ), ma quella specificatamente richiedeva una valutazione da sinistra a destra.

Esempi di input e output:

"-1^(-3*4/-6)" -> "1" "-2^(2^(4-1))" -> "256" "2*6/4^2*4/3" -> "1" 

Ho scritto un valutatore in C #, ma mi piacerebbe vedere quanto sia paragonabile a quello di programmatori più intelligenti nei loro linguaggi di scelta.

Relazionato:

Code Golf: valutazione di espressioni matematiche

chiarimenti:

  1. Facciamo di questa una funzione che accetta un argomento stringa e restituisce un risultato stringa.

  2. Per quanto riguarda il motivo per cui nessuna regex, beh, è ​​quello di livellare il campo di gioco. Penso che ci dovrebbe essere una sfida separata per “la regex più compatta”.

  3. L’utilizzo di StrToFloat () è accettabile. Con la “libreria di analisi” intendevo escludere cose come parser di grammatica generica, anche per livellare il campo di gioco.

  4. Supporta i galleggianti.

  5. Supporta le parate, l’esponenziazione e i quattro operatori aritmetici.

  6. Dare moltiplicazione e divisione uguale precedenza.

  7. Dare addizioni e sottrazioni alla precedenza.

  8. Per semplicità, si può presumere che tutti gli input siano ben formati.

  9. Non ho una preferenza sul fatto che la tua funzione accetti cose come “.1” o “1e3” come numeri validi, ma accettandoli ti guadagnarei punti brownie. 😉

  10. Per i casi di divisione per zero, potresti forse restituire “NaN” (supponendo che desideri implementare la gestione degli errori).