feat: complete assignment

This commit is contained in:
Stevan Freeborn
2026-06-29 07:14:19 -05:00
parent 28229d39aa
commit 865cba9797
17 changed files with 618 additions and 2 deletions
+62
View File
@@ -0,0 +1,62 @@
from collections.abc import Callable
class Calculator:
def __init__(self) -> None:
self.operators: dict[str, Callable[[float, float], float]] = {
"+": lambda a, b: a + b,
"-": lambda a, b: a - b,
"*": lambda a, b: a * b,
"/": lambda a, b: a / b,
}
self.precedence: dict[str, int] = {
"+": 1,
"-": 1,
"*": 2,
"/": 2,
}
def evaluate(self, expression: str) -> float | None:
if not expression or expression.isspace():
return None
tokens = expression.strip().split()
return self._evaluate_infix(tokens)
def _evaluate_infix(self, tokens: list[str]) -> float:
values: list[float] = []
operators: list[str] = []
for token in tokens:
if token in self.operators:
while (
operators
and operators[-1] in self.operators
and self.precedence[operators[-1]] >= self.precedence[token]
):
self._apply_operator(operators, values)
operators.append(token)
else:
try:
values.append(float(token))
except ValueError:
raise ValueError(f"invalid token: {token}")
while operators:
self._apply_operator(operators, values)
if len(values) != 1:
raise ValueError("invalid expression")
return values[0]
def _apply_operator(self, operators: list[str], values: list[float]) -> None:
if not operators:
return
operator = operators.pop()
if len(values) < 2:
raise ValueError(f"not enough operands for operator {operator}")
b = values.pop()
a = values.pop()
values.append(self.operators[operator](a, b))
+1
View File
@@ -0,0 +1 @@
lorem ipsum dolor sit amet
+14
View File
@@ -0,0 +1,14 @@
import json
def format_json_output(expression: str, result: float, indent: int = 2) -> str:
if isinstance(result, float) and result.is_integer():
result_to_dump = int(result)
else:
result_to_dump = result
output_data = {
"expression": expression,
"result": result_to_dump,
}
return json.dumps(output_data, indent=indent)