82 lines
1.5 KiB
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()
|
|
}
|