From 3aa60c0700bae5a3eeab4720cd3671306ed714df Mon Sep 17 00:00:00 2001 From: Marcel Fries Date: Mon, 2 Dec 2019 13:52:49 +0100 Subject: [PATCH] Day 1 + 2 --- .gitignore | 1 + day01/input.txt | 100 +++++++++++++++++++++++++++++++++++++++++++++ day01/main.nim | 24 +++++++++++ day02/computer.nim | 69 +++++++++++++++++++++++++++++++ day02/input.txt | 1 + day02/main.nim | 19 +++++++++ 6 files changed, 214 insertions(+) create mode 100644 .gitignore create mode 100644 day01/input.txt create mode 100644 day01/main.nim create mode 100644 day02/computer.nim create mode 100644 day02/input.txt create mode 100644 day02/main.nim diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adb36c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.exe \ No newline at end of file diff --git a/day01/input.txt b/day01/input.txt new file mode 100644 index 0000000..72c227f --- /dev/null +++ b/day01/input.txt @@ -0,0 +1,100 @@ +51360 +95527 +72603 +128601 +68444 +138867 +67294 +134343 +62785 +53088 +134635 +137884 +97654 +103704 +138879 +87561 +83922 +68414 +84876 +105143 +76599 +98924 +57080 +63590 +50126 +111872 +55754 +64410 +78488 +56557 +105446 +127182 +59451 +87249 +61652 +131698 +148820 +95742 +68223 +121744 +65678 +99745 +64089 +75610 +106085 +100364 +116959 +122862 +56580 +109631 +82895 +79666 +133474 +50579 +83473 +140028 +125999 +68225 +131345 +90797 +84914 +81915 +65369 +71230 +50379 +106385 +118503 +119640 +138540 +70678 +95881 +100282 +123060 +147368 +93030 +82553 +131271 +147675 +111126 +115183 +82956 +145698 +99261 +52768 +99207 +123551 +64738 +117275 +98136 +111592 +78576 +118613 +130351 +68567 +72356 +85608 +129414 +66521 +76924 +130449 \ No newline at end of file diff --git a/day01/main.nim b/day01/main.nim new file mode 100644 index 0000000..87e6154 --- /dev/null +++ b/day01/main.nim @@ -0,0 +1,24 @@ +import math, strutils + +proc fuelCalc(mass: int): int = + floor(mass / 3).toInt - 2 + + +proc calcForFuel(fuelMass: int): int = + let required = fuelCalc(fuelMass) + if required <= 0: + return 0 + else: + return required + calcForFuel(required) + +proc calc(mass: int): int = + var massFuel = fuelCalc(mass) + var fuelFuel = calcForFuel(massFuel) + return massFuel + fuelFuel + +var result = 0; +var file = open("input.txt", fmRead); +for line in file.lines: + result += calc(line.parseInt) + +echo result \ No newline at end of file diff --git a/day02/computer.nim b/day02/computer.nim new file mode 100644 index 0000000..cd1daec --- /dev/null +++ b/day02/computer.nim @@ -0,0 +1,69 @@ +import sequtils, strutils + +type + Program* = seq[int] + Input* = object + noun*: int + verb*: int + Computer* = ref object + source: Program # Original program code without modifications + program*: Program # The computers program in memory + ic*: int # The instruction counter + + StopExecution = object of Exception + ## This will be raised when the ending opcode is reached + +proc set(cp: Computer, address, value: int): void = + cp.program[address] = value + +proc get(cp: Computer, address: int): int = + cp.program[address] + +proc add(cp: Computer, param1, param2, param3: int): void = + cp.set(param3, (cp.get(param1) + cp.get(param2))) + +proc mul(cp: Computer, param1, param2, param3: int): void = + cp.set(param3, (cp.get(param1) * cp.get(param2))) + +proc newComputer*(sourceFile: string): Computer = + var file = readFile("input.txt"); + file.stripLineEnd + let source = map(split(file, ','), parseInt) + result = Computer(source: source, ic: 0) + +proc reset*(cp: Computer, input: Input): void = + ## Reset instruction pointer, program code and input values + cp.program = cp.source + cp.ic = 0 + cp.set(1, input.noun) + cp.set(2, input.verb) + +proc process(cp: Computer): void = + let opCode = cp.get(cp.ic) + if opCode == 99: # End Execution + raise newException(StopExecution, "Program ended") + if opCode == 1: # Addition + cp.add(cp.get(cp.ic+1), cp.get(cp.ic+2), cp.get(cp.ic+3)) + if opCode == 2: # Multiplication + cp.mul(cp.get(cp.ic+1), cp.get(cp.ic+2), cp.get(cp.ic+3)) + cp.ic += 4 + +proc run*(cp: Computer): int = + ## Runs the program loaded in memory until complete + try: + while true: + cp.process + except StopExecution: + return cp.get(0) + return -1 # Something went wrong + +proc findInputFor*(cp: Computer, target: int): Input = + ## Finds fitting inputs to produce the desired output + ## Stops at the first match + for noun in 0 .. 99: + for verb in 0 .. 99: + let input = Input(noun: noun, verb: verb) + cp.reset(input) + var output = cp.run + if output == target: + return input \ No newline at end of file diff --git a/day02/input.txt b/day02/input.txt new file mode 100644 index 0000000..ec8a0ca --- /dev/null +++ b/day02/input.txt @@ -0,0 +1 @@ +1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,1,6,19,1,5,19,23,1,23,6,27,1,5,27,31,1,31,6,35,1,9,35,39,2,10,39,43,1,43,6,47,2,6,47,51,1,5,51,55,1,55,13,59,1,59,10,63,2,10,63,67,1,9,67,71,2,6,71,75,1,5,75,79,2,79,13,83,1,83,5,87,1,87,9,91,1,5,91,95,1,5,95,99,1,99,13,103,1,10,103,107,1,107,9,111,1,6,111,115,2,115,13,119,1,10,119,123,2,123,6,127,1,5,127,131,1,5,131,135,1,135,6,139,2,139,10,143,2,143,9,147,1,147,6,151,1,151,13,155,2,155,9,159,1,6,159,163,1,5,163,167,1,5,167,171,1,10,171,175,1,13,175,179,1,179,2,183,1,9,183,0,99,2,14,0,0 diff --git a/day02/main.nim b/day02/main.nim new file mode 100644 index 0000000..a45b364 --- /dev/null +++ b/day02/main.nim @@ -0,0 +1,19 @@ +import computer + +proc solvePart1(): void = + var + cp = newComputer("input.txt") + input = Input(noun: 12, verb: 2) + cp.reset(input) + let result = cp.run + echo "Result for Part 1: ", result + +proc solvePart2(): void = + var + target = 19690720 + cp = newComputer("input.txt") + inputs = cp.findInputFor(target) + echo "result for Part 2: ", 100 * inputs.noun + inputs.verb + +solvePart1() +solvePart2() \ No newline at end of file