2023 Day 4 Part 1
This commit is contained in:
parent
cfeaa92460
commit
ca613a0315
1 changed files with 45 additions and 0 deletions
45
2023/day04.nim
Normal file
45
2023/day04.nim
Normal file
|
|
@ -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()
|
||||||
Loading…
Reference in a new issue