31 lines
852 B
Nim
31 lines
852 B
Nim
|
import sets, streams, strutils, options
|
||
|
|
||
|
# Day 1
|
||
|
|
||
|
let day1TargetSum = 2020
|
||
|
|
||
|
proc part1*(strm: Stream): Option[int] =
|
||
|
var targets = initHashSet[int]()
|
||
|
for line in strm.lines():
|
||
|
let n = parseInt line
|
||
|
if targets.contains(day1TargetSum - n):
|
||
|
return some((day1TargetSum - n) * n)
|
||
|
else:
|
||
|
targets.incl n
|
||
|
|
||
|
proc part2*(strm: Stream): Option[int] =
|
||
|
# 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):
|
||
|
return some(n * n2 * (nTargetSum - n2))
|
||
|
iset.incl n2
|