From 819ab0f508a9f14de38885f10ac30bc319fb6caf Mon Sep 17 00:00:00 2001 From: Danny Harpigny Date: Sun, 31 Dec 2023 08:18:28 +0000 Subject: [PATCH] --- 2023/04/both.nim | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 2023/04/both.nim diff --git a/2023/04/both.nim b/2023/04/both.nim new file mode 100644 index 0000000..9d2ac73 --- /dev/null +++ b/2023/04/both.nim @@ -0,0 +1,54 @@ +import + std/math, + std/sequtils, + std/strformat, + std/strutils + +import + ../../adventofcode + +let input = adventofcode.getInput() + +when not defined(second): + var points = 0 +else: + var additionalCards: seq[Natural] = @[] + +let lines = input.splitLines() +for i in 0 .. lines.high(): + let line = lines[i] + when defined(second): + if additionalCards.high() < i: + additionalCards.add 0 + let instances = 1 + additionalCards[i] + let winningNumsStart = line.find(':') + 1 + let winningNumsEnd = line.find('|') + let winningNums = line[winningNumsStart ..< winningNumsEnd] + .split(' ') + .filterIt(it != "") + .mapIt(parseInt it) + let elfNums = line[winningNumsEnd + 1 .. ^1] + .split(' ') + .filterIt(it != "") + .mapIt(parseInt it) + + var duplicata = 0 + for n in elfNums: + if n in winningNums: + duplicata.inc() + + when not defined(second): + if duplicata > 0: + points += 2 ^ (duplicata - 1) + else: + for j in 1 .. duplicata: + if additionalCards.high() < i + j: + additionalCards.add 0 + additionalCards[i + j] += instances + +when not defined(second): + echo fmt"Answer: {points}" +else: + var originalCardCount = len(lines) + var additionalCardSum = sum(additionalCards) + echo fmt"Answer: {originalCardCount + additionalCardSum}" \ No newline at end of file