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