advent-of-code/2020/src/day1.nim

30 lines
804 B
Nim
Raw Normal View History

2020-12-03 09:54:58 -06:00
import sets, streams, strutils, options, input_helpers
2020-12-02 21:33:18 -06:00
# Day 1
let day1TargetSum = 2020
2020-12-03 09:54:58 -06:00
proc part1*(s: Stream): int =
2020-12-02 21:33:18 -06:00
var targets = initHashSet[int]()
2020-12-03 09:54:58 -06:00
for n in asInts(s):
2020-12-02 21:33:18 -06:00
if targets.contains(day1TargetSum - n):
2020-12-03 09:54:58 -06:00
return (day1TargetSum - n) * n
2020-12-02 21:33:18 -06:00
else:
targets.incl n
2020-12-03 09:54:58 -06:00
proc part2*(strm: Stream): int =
2020-12-02 21:33:18 -06:00
# this works exactly the same as the previous algorithm, except we simply
# permute once more
# TODO: if I was really cool, I could split the shared functionality into
# a shared proc
var nums: seq[int]
for line in strm.lines():
nums.add parseInt line
for n in nums:
var iset = initHashSet[int]()
let nTargetSum = day1TargetSum - n
for n2 in nums:
if iset.contains(nTargetSum - n2):
2020-12-03 09:54:58 -06:00
return n * n2 * (nTargetSum - n2)
2020-12-02 21:33:18 -06:00
iset.incl n2