main.go (1546B)
1 package main 2 3 import ( 4 "bufio" 5 "fmt" 6 "os" 7 "strconv" 8 ) 9 10 func readInput(filename string) (res []int64) { 11 file, _ := os.Open(filename) 12 defer file.Close() 13 14 scanner := bufio.NewScanner(file) 15 for scanner.Scan() { 16 num, _ := strconv.ParseInt(scanner.Text(), 10, 64) 17 res = append(res, num) 18 } 19 return 20 } 21 22 func main() { 23 input := readInput("./input.txt") 24 // 14144619 25 fmt.Println(part1(input)) 26 // 1766397 27 fmt.Println(part2(input)) 28 } 29 30 func part1(input []int64) (int64, bool) { 31 preambleLen := 25 32 window := make(map[int64]int) 33 for i := 0; i < preambleLen; i++ { 34 window[input[i]] += 1 35 } 36 for i := preambleLen; i < len(input); i++ { 37 found := false 38 for j := i - preambleLen; j < i; j++ { 39 if (input[i] != 2*input[j] && window[input[i]-input[j]] >= 1) || 40 (input[i] == 2*input[j] && window[input[j]] >= 2) { 41 found = true 42 break 43 } 44 } 45 if !found { 46 return input[i], true 47 } 48 window[input[i-preambleLen]] -= 1 49 window[input[i]] += 1 50 } 51 return 0, false 52 } 53 54 func minMax(input []int64) (min int64, max int64) { 55 min, max = input[0], input[0] 56 for _, v := range input { 57 if v < min { 58 min = v 59 } 60 if v > max { 61 max = v 62 } 63 } 64 return 65 } 66 67 func part2(input []int64) (int64, bool) { 68 target, _ := part1(input) 69 cumsum := []int64{0} 70 for _, v := range input { 71 cumsum = append(cumsum, cumsum[len(cumsum)-1]+v) 72 } 73 for i := 0; i < len(cumsum); i++ { 74 for j := i + 1; j < len(cumsum); j++ { 75 if cumsum[j]-cumsum[i] == target { 76 min, max := minMax(input[i:j]) 77 return min + max, true 78 } 79 } 80 } 81 return 0, false 82 }