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() }