Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Calculator-IV by tokiojapan55
def calculator(log: str) -> str:
cpu = {
"display": "0",
"state": "num",
"operator": "=",
"memory": 0,
"pre": "",
"last": "",
"error": False,
}
def calc(expr):
ans = eval(expr)
disp = str(ans)
if disp[0] == '-':
disp = disp[1:]
point = disp.find(".")
if point < 0 or len(disp) <= 5:
return ans
major = disp[:point]
minor = disp[point + 1:]
while len(major) + 1 + len(minor) > 5 and len(minor) > 0:
if int(minor[-1]) < 5:
minor = minor[:-1]
elif len(minor) == 1:
minor = ""
major = str(int(major) + 1)
else:
minor = minor[:-1]
n = len(minor)
minor = str(int(minor) + 1)
if len(minor) > n:
minor = minor[1:]
major = str(int(major) + 1)
return eval(major + "." + minor)
for k in list(log):
if k.isdigit() or k == ".":
if cpu["state"] != "num" or cpu["display"] == "0":
cpu["display"] = k
elif len(cpu["display"]) < 5:
cpu["display"] += k
cpu["state"] = "num"
elif k in "=+-":
if cpu["operator"] == "=" and cpu["pre"] not in "+-=":
cpu["memory"] = calc(cpu["display"])
elif cpu["pre"] + k == "+=":
cpu["last"] = "+" + str(cpu["memory"])
cpu["memory"] = calc(str(cpu["memory"]) + "*2")
elif cpu["pre"] + k == "-=":
cpu["last"] = "-" + str(cpu["memory"])
cpu["memory"] = 0 if type(cpu["memory"]) is int else 0.0
elif cpu["pre"] + k == "==":
cpu["memory"] = calc(str(cpu["memory"]) + cpu["last"])
elif cpu["operator"] == "=":
cpu["memory"] = calc(cpu["display"])
elif cpu["state"] == "num":
cpu["last"] = cpu["operator"] + cpu["display"]
cpu["memory"] = calc(str(cpu["memory"]) + cpu["last"])
if abs(cpu["memory"]) >= 100000:
cpu["error"] = True
cpu["display"] = str(cpu["memory"])
if len(cpu["display"]) >= 2 and cpu["display"][-2:] == ".0":
cpu["display"] = cpu["display"][:-1]
if cpu["display"][-1] == "." and abs(cpu["memory"]) >= 10000:
cpu["error"] = True
cpu["state"] = "ope"
cpu["operator"] = k
cpu["pre"] = k
return "error" if cpu["state"] != "num" and cpu["error"] else cpu["display"]
Aug. 18, 2023
Comments: