Mathematical Operations Parser and Evaluator

 
s='123.4+ 12*3.1-34/3 +2 \
      -7//2 +2**3+11='
def curatare(s):
   ss=''
   for c in s:
      if c not in '\t\ ':
         ss+=c
   return ss
 
print(s)
s=curatare(s)#curata space, tab, \
print(s)
 
dict={'**':lambda a, b : a ** b,
      '*': lambda a, b : a * b,
      '//':lambda a, b : a // b,
      '/': lambda a, b : a / b,
      '+': lambda a, b : a + b,
      '-': lambda a, b : a - b}
 
 
def tokenizer(s):
   lista=[]
   i,prec=0,0
   while i<len(s):
      #fara = nu ne ataseaza ultimul numar
      if s[i] in '*/+-=':
         lista.append(s[prec:i])
         if s[i]=='*' and s[i+1]=='*':
            lista.append('**')
            i+=1
         elif s[i]=='/' and s[i+1]=='/':
            lista.append('//')
            i+=1
         else:
            lista.append(s[i])
         prec=i+1
      i+=1
   return lista
 
#o singura lista pt. numere si operatori
lista=tokenizer(s)
print(lista)
 
['123.4', '+', '12', '*', '3.1', '-', '34', '/', '3', '+', '2',
'-', '7', '//', '2', '+', '2', '**', '3', '+', '11', '=']
 
def calcul(lista):
   i=0;   lista0=[]
   while i < len(lista)-2:
      a, op, b = lista[i:i+3]
      print(a,op,b)
      if op in ['**','*','//','/']:
         lista0.append(dict[op](float(a), float(b))  )
         i+=2
      else:
         lista0.append(a) #a este numar,+ sau -
      print(lista0)
      i+=1
   lista0.append(lista[len(lista)-2])#ultimul numar
   print(lista0)
   lista=lista0
   suma=float(lista[0])
   for i in range(1, len(lista), 2):
      op, b = lista[i:i+2]   #op este + sau -
      suma=dict[op](suma, float(b) )
      print(suma)
   return suma
 
suma=calcul(lista)
print(suma)
 
Erori ale programului
 
Programul  NU tine cont de ordinea operatiilor
pentru **:
Si calculeaza gresit  de la stanga la dreapta
2**3**2=8**2=64
 
(Corect  este 2**3**2=2**9=512  de la
dreapta la stanga)
 
 
dict={'**':lambda a, b : a ** b,
      '*': lambda a, b : a * b,
      '//':lambda a, b : a // b,
      '/': lambda a, b : a / b,
      '+': lambda a, b : a + b,
      '-': lambda a, b : a - b}
 
def eval_postfix(s):
   s = s.split()
   stack = []
   for val in s:
      if val in dict.keys():
         op = dict[val]
         a,b = stack[-2:]
         stack[-2:] = [op(a,b)]
      else:
         stack.append(float(val))
      #print(val, stack)
   return stack[-1]
 
#print(eval_postfix('1 2 + 7 /'))
 
EVAL versiunea II
 
def infix2postfix(s):
   prec = {'**':4,'*':3,'//':3,'/':3,'+':2,'-':2}
   s = s.split()
   stack = []
   ss = []
 
   for val in s:
      if val in dict.keys():
            while len(stack)>0 and  \
  
(prec[stack[-1]] >= prec[val]):
                  ss.append(stack.pop())
            stack.append(val)
      else:
         ss.append(val)
      #print(val, stack, postfixList)
   for op in stack[::-1]:
      ss.append(op)
   return ' '.join(ss)
 
s='123.4 + 12 * 3.1 - 34 / 3 + 2 - 7 // 2 + 2 ** 3 + 11'
ss=infix2postfix(s)
print(ss)
print(eval_postfix(ss))
 
Tokens3
while not at_goal():
    if object_here():
        take()
        move()
        put('token')
        move()
    else:
        move()
 
Home4
while not at_goal():
    if  front_is_clear():
        move()
    else:
        if wall_on_right():
            turn_left()
        else:
            turn_right()
 
http://reeborg.ca/
 
Tokens4
Tokens 5
while not at_goal():
    if object_here():
        take()
        move()
    else:
        while carries_object():
            put('token')
        move()
 
 
Around1-variable
put('token')
move()
while not object_here():
    if  front_is_clear():
        move()
    else:
       turn_left()
 
Around1-apple
move()
while not at_goal():
    if  front_is_clear():
        if object_here():
            take()
        else:
            move()
    else:
        turn_left()
 
Around2
put('token')
move()
while not object_here():
    if wall_in_front():
            turn_left()
    else:
        if wall_on_right():
            move()
        else:
            turn_right()
            move()
 
Around3
Insert
turn_left()
in Around2
 
Around4
Insert
turn_left()
turn_left()
move()
turn_right()
in Around2
 
Tokens6 Puzzle
Aduna n tokens asezate aleator si le pune la n pasi de cel mai din dreapta token
 
think(0)
from random import randrange
#World("Alone")
n=15
RUR.set_world_size(n, 1)
goal = n, 1
start = 1, 1
RUR.add_initial_position(*start)
RUR.add_final_position("house", *goal)
count = randrange(3,6)
pos=0
maxim=0
for i in range(count):
    pos=randrange(1,n-count)
    print(i+1,pos)
    if maxim<pos: maxim=pos
    RUR.add_object(‘token’, pos, 1)
print(count,pos)
RUR.add_object("token", maxim+count, 1, {"number": count, "goal": True})
 
count=0
pos=1
pos_object=0
while front_is_clear():
    if object_here():
        while object_here():
            take('token')
            count+=1
        pos_object=pos
        print(pos_object)
        move()
        pos+=1
    else:
        move()
        pos+=1
 
turn_left()
turn_left()
for i in range(pos-pos_object-count):
    move()
turn_left()
turn_left()
while carries_object():
    put('token')
for i in range(pos-pos_object-count):
    move()
 
from library import up, down, right, left
think(0)
up(3)
right()
#World("Alone")
RUR.set_world_size(7, 7)
 a=[[1,1,1,1,1,1,1],
   [1,0,0,1,1,1,1],
   [1,0,0,1,0,0,1],
   [1,0,0,0,0,0,1],
   [1,1,0,0,0,0,1],
   [1,1,0,0,0,0,1],
   [1,1,1,1,1,1,1]]
for r in range(7):
    for c in range(7):
        if a[r][c]==1:
            RUR.add_obstacle('bricks',c+1,r+1)
RUR.add_pushable('box',3,4)
RUR.add_pushable('box',5,4)
RUR.add_pushable('box',3,2,{'goal':True})
RUR.add_pushable('box',2,4,{'goal':True})
 
def up(n=1):
    RUR.CURRENT_WORLD.robots[0]._orientation = RUR.NORTH
    for i in range(n):
        move()
        #movebox()
 
def down(n=1):
    RUR.CURRENT_WORLD.robots[0]._orientation = RUR.SOUTH
    for i in range(n):
        move()
        #movebox()
def left(n=1):
    RUR.CURRENT_WORLD.robots[0]._orientation = RUR.WEST
    for i in range(n):
        move()
        #movebox()
 
def right(n=1):
    RUR.CURRENT_WORLD.robots[0]._orientation = RUR.EAST
    for i in range(n):
        move()
        #movebox()
 
def movebox():
    if object_here('box'):
        take("box")
        toss("box")
 
Think(300)
right()
up()
right(3)
down(2)
left()
up()
left(2)
right(3)
up()
left(2)
up()
left()
down(3)
 
def life(m):
   n=len(m)
   nextm=[[0]*n for i in range(n)]
   for r in range(n):
      for c in range(n):
         v=vecini(m,r,c)
         if v<2 or v>3:
            nextm[r][c]=0
         elif v==3 and m[r][c]==0:
            nextm[r][c]=1
         else:
            nextm[r][c]=m[r][c]
   return nextm
 
from library import adaug,afis,vecini,life
think(0);set_max_nb_steps(3500)
n=10; count=100
a=[[0]*n for i in range(n)]
#a=adaug(a)
a[3][1]=a[3][2]=a[3][3]=1
a[5][2]=a[5][3]=a[5][4]=1
while count>0:
   a=life(a)
   afis(a)
   count-=1
 
from random import randrange
def adaug(m):
   n=len(m)
   for i in range(n*n//2):
      x=randrange(n*n)
      r=x//n;c=x%n
      m[r][c]=1
   return m
 
def afis(m):
   n=len(m)
   for r in range(n):
      for c in range(n):
          if m[r][c]==1:
            RUR.add_colored_tile("blue",c+1,r+1)
          else:
            RUR.add_colored_tile("yellow",c+1,r+1)
 
def vecini(m,i,j):
   suma=-m[i][j]
   for r in range(-1,2):
      for c in range(-1,2):
         suma+=m[(i+r)%len(m)][(j+c)%len(m)]
   return suma
 
Slide Note
Embed
Share

This program reads a mathematical expression, tokenizes it, and evaluates it based on the order of operations. It demonstrates parsing infix to postfix notation and evaluating postfix expressions. The code contains functions for cleaning input, tokenizing expressions, and calculating results, along with handling errors related to operation order. Images and links to Reeborg's World are included for visual demonstrations.

  • Parsing
  • Evaluation
  • Mathematical Operations
  • Algorithms
  • Tokenization

Uploaded on Sep 11, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. s='123.4+ 12*3.1-34/3 +2 \ -7//2 +2**3+11=' def curatare(s): ss='' for c in s: if c not in '\t\ ': ss+=c return ss def tokenizer(s): lista=[] i,prec=0,0 while i<len(s): #fara = nu ne ataseaza ultimul numar if s[i] in '*/+-=': lista.append(s[prec:i]) if s[i]=='*' and s[i+1]=='*': lista.append('**') i+=1 elif s[i]=='/' and s[i+1]=='/': lista.append('//') i+=1 else: lista.append(s[i]) prec=i+1 i+=1 return lista print(s) s=curatare(s)#curata space, tab, \ print(s) dict={'**':lambda a, b : a ** b, '*': lambda a, b : a * b, '//':lambda a, b : a // b, '/': lambda a, b : a / b, '+': lambda a, b : a + b, '-': lambda a, b : a - b} #o singura lista pt. numere si operatori lista=tokenizer(s) print(lista) ['123.4', '+', '12', '*', '3.1', '-', '34', '/', '3', '+', '2', '-', '7', '//', '2', '+', '2', '**', '3', '+', '11', '=']

  2. def calcul(lista): i=0; lista0=[] while i < len(lista)-2: a, op, b = lista[i:i+3] print(a,op,b) if op in ['**','*','//','/']: lista0.append(dict[op](float(a), float(b)) ) i+=2 else: lista0.append(a) #a este numar,+ sau - print(lista0) i+=1 lista0.append(lista[len(lista)-2])#ultimul numar print(lista0) lista=lista0 suma=float(lista[0]) for i in range(1, len(lista), 2): op, b = lista[i:i+2] #op este + sau - suma=dict[op](suma, float(b) ) print(suma) return suma Erori ale programului Programul NU tine cont de ordinea operatiilor pentru **: Si calculeaza gresit de la stanga la dreapta 2**3**2=8**2=64 (Corect este 2**3**2=2**9=512 de la dreapta la stanga) suma=calcul(lista) print(suma)

  3. EVAL versiunea II def infix2postfix(s): prec = {'**':4,'*':3,'//':3,'/':3,'+':2,'-':2} s = s.split() stack = [] ss = [] dict={'**':lambda a, b : a ** b, '*': lambda a, b : a * b, '//':lambda a, b : a // b, '/': lambda a, b : a / b, '+': lambda a, b : a + b, '-': lambda a, b : a - b} for val in s: if val in dict.keys(): while len(stack)>0 and \ ss.append(stack.pop()) stack.append(val) else: ss.append(val) #print(val, stack, postfixList) for op in stack[::-1]: ss.append(op) return ' '.join(ss) def eval_postfix(s): s = s.split() stack = [] for val in s: if val in dict.keys(): op = dict[val] a,b = stack[-2:] stack[-2:] = [op(a,b)] else: stack.append(float(val)) #print(val, stack) return stack[-1] (prec[stack[-1]] >= prec[val]): s='123.4 + 12 * 3.1 - 34 / 3 + 2 - 7 // 2 + 2 ** 3 + 11' ss=infix2postfix(s) print(ss) print(eval_postfix(ss)) #print(eval_postfix('1 2 + 7 /'))

  4. http://reeborg.ca/ Home4 while not at_goal(): if front_is_clear(): move() else: if wall_on_right(): turn_left() else: turn_right() Tokens3 while not at_goal(): if object_here(): take() move() put('token') move() else: move() Tokens4 Tokens 5 while not at_goal(): if object_here(): take() move() else: while carries_object(): put('token') move()

  5. Around1-apple move() while not at_goal(): if front_is_clear(): if object_here(): take() else: move() else: turn_left() Around1-variable put('token') move() while not object_here(): if front_is_clear(): move() else: turn_left() Around2 put('token') move() while not object_here(): if wall_in_front(): turn_left() else: if wall_on_right(): move() else: turn_right() move() Around3 Insert turn_left() in Around2 Around4 Insert turn_left() turn_left() move() turn_right() in Around2

  6. Tokens6 Puzzle Aduna n tokens asezate aleator si le pune la n pasi de cel mai din dreapta token think(0) from random import randrange #World("Alone") n=15 RUR.set_world_size(n, 1) goal = n, 1 start = 1, 1 RUR.add_initial_position(*start) RUR.add_final_position("house", *goal) count = randrange(3,6) pos=0 maxim=0 for i in range(count): pos=randrange(1,n-count) print(i+1,pos) if maxim<pos: maxim=pos RUR.add_object( token , pos, 1) print(count,pos) RUR.add_object("token", maxim+count, 1, {"number": count, "goal": True})

  7. count=0 pos=1 pos_object=0 while front_is_clear(): if object_here(): while object_here(): take('token') count+=1 pos_object=pos print(pos_object) move() pos+=1 else: move() pos+=1 turn_left() turn_left() for i in range(pos-pos_object-count): move() turn_left() turn_left() while carries_object(): put('token') for i in range(pos-pos_object-count): move()

  8. from library import up, down, right, left think(0) up(3) right() #World("Alone") RUR.set_world_size(7, 7) a=[[1,1,1,1,1,1,1], [1,0,0,1,1,1,1], [1,0,0,1,0,0,1], [1,0,0,0,0,0,1], [1,1,0,0,0,0,1], [1,1,0,0,0,0,1], [1,1,1,1,1,1,1]] for r in range(7): for c in range(7): if a[r][c]==1: RUR.add_obstacle('bricks',c+1,r+1) RUR.add_pushable('box',3,4) RUR.add_pushable('box',5,4) RUR.add_pushable('box',3,2,{'goal':True}) RUR.add_pushable('box',2,4,{'goal':True})

  9. def up(n=1): RUR.CURRENT_WORLD.robots[0]._orientation = RUR.NORTH for i in range(n): move() #movebox() def down(n=1): RUR.CURRENT_WORLD.robots[0]._orientation = RUR.SOUTH for i in range(n): move() #movebox() def left(n=1): RUR.CURRENT_WORLD.robots[0]._orientation = RUR.WEST for i in range(n): move() #movebox() def movebox(): if object_here('box'): take("box") toss("box") def right(n=1): RUR.CURRENT_WORLD.robots[0]._orientation = RUR.EAST for i in range(n): move() #movebox()

  10. Think(300) right() up() right(3) down(2) left() up() left(2) right(3) up() left(2) up() left() down(3)

  11. from random import randrange def adaug(m): n=len(m) for i in range(n*n//2): x=randrange(n*n) r=x//n;c=x%n m[r][c]=1 return m def life(m): n=len(m) nextm=[[0]*n for i in range(n)] for r in range(n): for c in range(n): v=vecini(m,r,c) if v<2 or v>3: nextm[r][c]=0 elif v==3 and m[r][c]==0: nextm[r][c]=1 else: nextm[r][c]=m[r][c] return nextm def afis(m): n=len(m) for r in range(n): for c in range(n): if m[r][c]==1: RUR.add_colored_tile("blue",c+1,r+1) else: RUR.add_colored_tile("yellow",c+1,r+1) from library import adaug,afis,vecini,life think(0);set_max_nb_steps(3500) n=10; count=100 a=[[0]*n for i in range(n)] #a=adaug(a) a[3][1]=a[3][2]=a[3][3]=1 a[5][2]=a[5][3]=a[5][4]=1 while count>0: a=life(a) afis(a) count-=1 def vecini(m,i,j): suma=-m[i][j] for r in range(-1,2): for c in range(-1,2): suma+=m[(i+r)%len(m)][(j+c)%len(m)] return suma

Related


More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#