CSES - Laskutoimitus

Lisp-kielessä laskutoimitus annetaan sulkulausekkeena, jossa ensin on laskuoperaattori ja sen jälkeen yksi tai useampi lauseke. Esimerkiksi lauseke (+ 5 (* 3 2) 7) antaa tuloksen 18.

Tehtäväsi on toteuttaa koodi, joka laskee Lisp-tyylisen laskulausekkeen arvon. Voit olettaa, että lausekkeen pituus on enintään 1000 merkkiä, jokainen operaattori on + tai * ja jokainen laskennan aikana esiintyvä luku on välillä 0 \dots 10^{18}.

Python

Toteuta tiedostoon lisp.py funktio eval, joka antaa lausekkeen arvon.

def eval(s):
    # TODO

if __name__ == "__main__":
    print(eval("(+ 1 2 3 4 5)")) # 15
    print(eval("(+ 5 (* 3 2) 7)")) # 18
    print(eval("(* (+ (+ 1 2) 3) (+ (* 4 5) 6 2))")) # 168
    print(eval("(+ 123 456)")) # 579

Java

Tee tiedostoon Lisp.java metodi eval(s), joka antaa lausekkeen arvon.

public class Lisp {
    public long eval(String s) {
        // TODO
    }

    public static void main(String[] args) {
        Lisp l = new Lisp();
        System.out.println(l.eval("(+ 1 2 3 4 5)")); // 15
        System.out.println(l.eval("(+ 5 (* 3 2) 7)")); // 18
        System.out.println(l.eval("(* (+ (+ 1 2) 3) (+ (* 4 5) 6 2))")); // 168
        System.out.println(l.eval("(+ 123 456)")); // 579
    }
}