This commit is contained in:
2022-12-17 19:38:50 +01:00
parent 1557768450
commit 949178dd0c
4 changed files with 362 additions and 0 deletions

43
day_03/solve.nim Normal file
View File

@@ -0,0 +1,43 @@
import std/[strutils, sugar, options]
let priorityReference = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const input = readFile("day_03/input.txt")
proc priority(c: char): int {.inline.} =
priorityReference.find(c) + 1
proc first[T](s: openArray[T], test: T -> bool): Option[T] =
for item in s:
if item.test:
return some(item)
return none[T]()
iterator groups(s: string): seq[string] =
let lines = s.splitLines()
var i = 0
while i < lines.len:
yield lines[i..i+2]
i += 3
# Find the item type that appears in both compartments of each rucksack.
# What is the sum of the priorities of those item types?
proc solvePart1() =
var sum = 0
for runsack in input.splitLines:
let compartment1 = runsack.substr(0, int(runsack.len / 2) - 1)
let compartment2 = runsack.substr(int(runsack.len / 2), runsack.len - 1)
sum += compartment1.first(c => compartment2.contains(c)).map(c => c.priority).get(0)
echo "Sum of misaligned items: " & $sum
# Find the item type that corresponds to the badges of each three-Elf group.
# What is the sum of the priorities of those item types?
proc solvePart2() =
var sum = 0
for group in groups(input):
sum += group[0].first(c => group[1].contains(c) and group[2].contains(c)).map(c => c.priority).get(0)
echo "Sum of group badges: " & $sum
if isMainModule:
solvePart1()
solvePart2()