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 } }