From 329ddafc220cbe6ce8cb8661574bc4b2a000530e Mon Sep 17 00:00:00 2001 From: An0nSaiko Date: Fri, 23 Dec 2022 01:40:09 +0200 Subject: Day 21 (part1) --- day21/solution.nim | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 day21/solution.nim (limited to 'day21/solution.nim') diff --git a/day21/solution.nim b/day21/solution.nim new file mode 100644 index 0000000..bbf77bd --- /dev/null +++ b/day21/solution.nim @@ -0,0 +1,66 @@ +import strutils +import sequtils +import tables +import strformat + +type + Node = ref object of RootObj + left, right: string + val: int + + AddNode = ref object of Node + SubNode = ref object of Node + MulNode = ref object of Node + DivNode = ref object of Node + +var nodes: Table[string, Node] + +method calc(node: Node): int = + node.val + +method calc(node: AddNode): int = + nodes[node.left].calc() + nodes[node.right].calc() + +method calc(node: SubNode): int = + nodes[node.left].calc() - nodes[node.right].calc() + +method calc(node: MulNode): int = + nodes[node.left].calc() * nodes[node.right].calc() + +method calc(node: DivNode): int = + nodes[node.left].calc() div nodes[node.right].calc() + +proc `$`(node: Node): string = + fmt"val: {node.val}, left: {node.left}, right: {node.right}" + +proc parseLine(line: string): void = + let tokens = line.split(": ") + let id = tokens[0] + let ops = tokens[1].split(" ") + + # if single token -> its a number + if ops.len() == 1: + nodes[id] = Node(val: ops[0].parseInt()) + else: + let left = ops[0] + let right = ops[2] + case ops[1]: + of "+": + nodes[id] = AddNode(left: left, right: right) + of "-": + nodes[id] = SubNode(left: left, right: right) + of "*": + nodes[id] = MulNode(left: left, right: right) + of "/": + nodes[id] = DivNode(left: left, right: right) + else: + assert(false) + +proc parseFile(): void = + let lines = readFile("./input.txt").strip().splitLines() + + for line in lines: + parseLine(line) + +parseFile() +echo nodes["root"].calc() -- cgit v1.2.3