From ca613a0315569d14f0fc3ccecc263bbedc06c47a Mon Sep 17 00:00:00 2001 From: Jeremy Kaplan Date: Sun, 3 Dec 2023 21:18:34 -0800 Subject: [PATCH] 2023 Day 4 Part 1 --- 2023/day04.nim | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 2023/day04.nim diff --git a/2023/day04.nim b/2023/day04.nim new file mode 100644 index 0000000..7742b2c --- /dev/null +++ b/2023/day04.nim @@ -0,0 +1,45 @@ +import std/enumerate +import std/math +import std/sequtils +import std/sets +import std/strscans +import std/strutils +import std/tables + +type Card = tuple + id: int + winning: HashSet[int] + mine: HashSet[int] + +proc parseCard(line: string): Card = + var winning, mine: string + if not scanf(line, "Card$s$i: $* | $*$.", result.id, winning, mine): + raise newException(ValueError, line) + + for num in winning.strip.splitWhitespace: + result.winning.incl num.parseInt + + for num in mine.strip.splitWhitespace: + result.mine.incl num.parseInt + +proc parseCards(text: string): seq[Card] = + let lines = text.strip.splitLines() + + for line in lines: + result.add parseCard(line) + +func score(card: Card): int = + let matches = len(card.winning * card.mine) + if matches > 0: + 2 ^ (matches - 1) + else: + 0 + +proc part1(): int = + let text = readFile("input/day04.txt") + let cards = parseCards(text) + + for card in cards: + result.inc card.score + +echo part1()