aoc-2020/d01/main.go

82 lines
1.5 KiB
Go

package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
)
func proccessLines(path string, f func(string) (stop bool, err error)) error {
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
stop, err := f(scanner.Text())
if stop || err != nil {
return err
}
}
if err := scanner.Err(); err != nil {
return err
}
return nil
}
func part1() {
seen := map[int]bool{}
err := proccessLines("./aoc-d1-input.txt", func(line string) (bool, error) {
num, err := strconv.Atoi(line)
if err != nil {
return true, err
}
pair := 2020 - num
if _, ok := seen[pair]; ok {
fmt.Printf("Found pair! %d + %d = 2020 Product = %d\n", num, pair, num*pair)
return true, nil
}
seen[num] = true
return false, nil
})
if err != nil {
log.Fatal(err)
}
}
type numberPair struct {
A, B int
}
func part2() {
singles := map[int]bool{}
doubles := map[int]numberPair{}
err := proccessLines("./aoc-d1-input.txt", func(line string) (bool, error) {
num, err := strconv.Atoi(line)
if err != nil {
return true, err
}
remain := 2020 - num
if pair, ok := doubles[remain]; ok {
fmt.Printf("Found set! %d + %d + %d = 2020 Prouct = %d\n", num, pair.A, pair.B, num*pair.A*pair.B)
return true, nil
}
for single := range singles {
doubles[num+single] = numberPair{num, single}
}
singles[num] = true
return false, nil
})
if err != nil {
log.Fatal(err)
}
}
func main() {
part1()
part2()
}