Last active
September 26, 2017 15:49
-
-
Save 5nyper/7572dbff9793d0f4f6f9dd05fd7a8548 to your computer and use it in GitHub Desktop.
not a 0
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
### HW1 due 9/18(mon) | |
# Read "HW1 instruction and notes.docx" | |
# posted on canvas very carefully. | |
# Complete the five functions to upload | |
# them to Vocareum by the due date. | |
import time | |
def isNumber(s): | |
#s must be a non-empty string | |
#returns True if it's convertible to float, else False | |
if (len(s)==0 and not s =='') or not isinstance(s, str): | |
print("type mismatch error: isNumber") | |
return "type mismatch error: isNumber" | |
try: | |
s = float(s) | |
return True | |
except ValueError: | |
#print("type mismatch error: isNumber") | |
return False | |
def cleanUp(s): | |
priorSpace = True | |
inDecimal = False | |
ops = ["+","-","*","/","^"] | |
s = s.replace("+", " + ").replace("-", " - ").replace("*", " * ").replace("/", " / ").replace("^", " ^ ") | |
st = list(s) | |
for i,c in enumerate(s): | |
if (not isNumber(c) and c not in ops) and priorSpace: | |
if c == "." and not inDecimal: | |
inDecimal = True | |
elif c == "." and inDecimal: | |
st[i] = "" | |
else: | |
st[i] = "" | |
inDecimal = False | |
elif (not isNumber(c) and c not in ops) and not priorSpace: | |
if c == "." and not inDecimal: | |
inDecimal = True | |
elif c == "." and inDecimal: | |
st[i] = "" | |
else: | |
st[i] = " " | |
priorSpace = True | |
inDecimal = False | |
else: | |
priorSpace = False | |
final = ''.join(st).strip().split(' ') | |
if '-' in final[0]: | |
del final[0] | |
final[0] = '-' + final[0] | |
newNumber, newOpr, oprPos = getNextNumber(final, 0) | |
if oprPos == None: | |
return newNumber | |
cacheNum=newNumber | |
pos=oprPos+1 #the new current position | |
opr=newOpr | |
while pos<(len(final)-1): | |
newNumber, newOpr, oprPos = getNextNumber(final, pos) | |
if (newOpr == None): | |
break | |
if (not isNumber(newNumber) and newNumber == '-'): | |
nex = getNextNumber(final, oprPos)[0] #BOOKMARK | |
del final[final.index(newNumber)] #BOOKMARK | |
index = final.index(nex) | |
final[index] = '-' + final[index] | |
temp = final[index] | |
if (not isNumber(newNumber) and newNumber != '-'): | |
print("error at line AB", newNumber) | |
return "error at line AB" | |
pos=oprPos+1 | |
return (final) | |
def getNextNumber(expr, pos): | |
#expr is a given arithmetic formula in string | |
temp = expr | |
#pos = start position in expr | |
#1st returned value = the next number (None if N/A) | |
#2nd returned value = the next operator (None if N/A) | |
#3rd retruned value = the next operator position (None if N/A) | |
ops = ["+","-","*","/"] | |
if len(expr)==0 or pos<0 or pos>=len(expr) or not isinstance(pos, int): | |
print("type mismatch error: getNextNumber") | |
return None, None, "type mismatch error: getNextNumber" | |
#--- function code starts ---# | |
res3 = 0 | |
res2 = 0 | |
if (pos+1) < len(temp): | |
res3 = pos+1 | |
res2 = temp[pos+1] | |
else: | |
res3 = None | |
res2 = None | |
return ((temp[pos], res2, res3)) | |
#--- function code ends ---# | |
def exeOpr(num1, opr, num2): | |
#This is a simple utility function skipping type check | |
if opr=="+": | |
return num1+num2 | |
elif opr=="-": | |
return num1-num2 | |
elif opr=="*": | |
return num1*num2 | |
elif opr=="/": | |
return num1/num2 | |
elif opr=="^": | |
return num1**num2 | |
else: | |
return None | |
def calc(expr): | |
#expr: nonempty string that is an arithmetic expression | |
#the fuction returns the calculated result | |
expr = cleanUp(expr) | |
if len(expr)<=0: | |
print("argument error: line A in eval_expr") #Line A | |
return "argument error: line A in eval_expr" | |
#Hold two modes: "addition" and "multiplication" | |
#Initializtion: get the first number | |
newNumber, newOpr, oprPos = getNextNumber(expr, 0) | |
ops = ["^","*","/","+","-"] | |
if newNumber is None or not isNumber(newNumber): | |
print("input formula error: line B in eval_expr") #Line B | |
return "input formula error: line B in eval_expr" | |
elif newOpr is None or not newOpr in ops: | |
return newNumber | |
cacheNum=newNumber | |
pos=oprPos+1 #the new current position | |
opr=newOpr #the new current operator | |
#start the calculation. Use the above functions effectively. | |
new_expr = expr | |
while True: | |
newNumber, newOpr, oprPos = getNextNumber(new_expr, pos) | |
#print(cacheNum, opr, newNumber, "The next opr however is", newOpr) | |
if (not isNumber(newNumber)): | |
print("input formula error: line C in eval_expr") #Line C | |
return "input formula error: line C in eval_expr" | |
if (newOpr == None): | |
break | |
if(newOpr == "^"): | |
temp = getNextNumber(new_expr, oprPos+1)[0] | |
if (not isNumber(temp)): | |
print("input formula error: line D in eval_expr") #Line D | |
return "input formula error: line D in eval_expr" | |
#print("Weee", newOpr, newNumber, "with", temp) | |
subs = exeOpr(float(newNumber), newOpr, float(temp)) | |
del new_expr[oprPos-1] | |
del new_expr[oprPos-1] | |
new_expr[oprPos-1] = str(subs) | |
#print("The new expression to start calculating is: " + new_expr) | |
elif((newOpr == "*" or newOpr == "/") and (opr not in ["^","*","/"])): | |
temp, temp_Opr, temp_Pos = getNextNumber(new_expr, oprPos+1) | |
#print("uhhh", temp_Opr) | |
if temp_Opr == "^": | |
temp2 = getNextNumber(new_expr, oprPos+3)[0] | |
if (not isNumber(temp)): | |
print("input formula error: line D in eval_expr") #Line D | |
return "input formula error: line D in eval_expr" | |
#print("We", temp_Opr, temp, "with", temp2) | |
subs = exeOpr(float(temp), temp_Opr, float(temp2)) | |
del new_expr[temp_Pos-1] | |
del new_expr[temp_Pos-1] | |
new_expr[temp_Pos-1] = str(subs) | |
#print("The new expression to start calculating is: " + new_expr) | |
else: | |
if (not isNumber(temp)): | |
print("input formula error: line D in eval_expr") #Line D | |
return "input formula error: line D in eval_expr" | |
#print("Weee", newOpr, newNumber, "with", temp) | |
subs = exeOpr(float(newNumber), newOpr, float(temp)) | |
del new_expr[oprPos-1] | |
del new_expr[oprPos-1] | |
new_expr[oprPos-1] = str(subs) | |
#print("The new expression to start calculating is: " + new_expr) | |
elif((newOpr == "+" or newOpr == "-") and opr not in ["+","-"]): | |
subs = exeOpr(float(cacheNum), opr, float(newNumber)) | |
del new_expr[pos-2] | |
del new_expr[pos-2] | |
new_expr[pos-2] = str(subs) | |
cacheNum=str(subs) | |
opr=newOpr | |
#print("The new expressionn to start calculating is: " + new_expr) | |
else: | |
subs = exeOpr(float(cacheNum), opr, float(newNumber)) | |
del new_expr[pos-2] | |
del new_expr[pos-2] | |
new_expr[pos-2] = str(subs) | |
#print("The new expression to start calculating is: " + new_expr) | |
cacheNum=str(subs) | |
opr=newOpr | |
subs = exeOpr(float(cacheNum), opr, float(newNumber)) | |
#print(new_expr) | |
del new_expr[new_expr.index(cacheNum)] | |
del new_expr[new_expr.index(opr)] | |
new_expr[new_expr.index(newNumber)] = str(subs) | |
return float(new_expr[0]) | |
start = time.time() | |
print(calc("-3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+ 324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/ 1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324 +1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2 +3*234*2- 3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486* 2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+ 324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/ 1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324 +1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2 +3*234*2- 3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486* 2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+ 324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/ 1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324 +1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2 +3*234*2- 3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486* 2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+ 324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/ 1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324 +1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2 +3*234*2- 3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234+2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234-2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486*2+3*234*2-3245324+1*2365/2+2384765-34535+124/1.5-3.5+324235*6.66+98434-438654+0-3865+32486* 2 ")) | |
fin = time.time() | |
print(fin - start) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment