package main import ( "bufio" "fmt" "os" "sort" "strconv" ) // Task1 ... func Task1(input []int) int { var ones int var threes int input = append([]int{0}, input...) sort.Ints(input) input = append(input, input[len(input)-1]+3) for i := 0; i < len(input)-1; i++ { jolt := input[i+1] - input[i] if jolt == 1 { ones++ } else if jolt == 3 { threes++ } } return ones * threes } func tri(n int) int { if n < 3 { return 0 } if n == 3 { return 1 } return tri(n-1) + tri(n-2) + tri(n-3) } // Task2 ... func Task2(input []int) int { input = append([]int{0}, input...) sort.Ints(input) input = append(input, input[len(input)-1]+3) var marker int samples := make([][]int, 0, 100) var maxLen int for i := 0; i < len(input)-1; i++ { jolt := input[i+1] - input[i] if jolt == 3 { end := i sample := input[marker:end] if end == len(input)-1 { sample = input[marker:] } if len(sample) > maxLen { maxLen = len(sample) } samples = append(samples, sample) marker = i + 1 } } triCached := make([]int, 0, 10) for i := 0; i < maxLen+1; i++ { triCached = append(triCached, tri(i+3)) } result := 1 for _, i := range samples { result *= triCached[len(i)] } return result } func main() { file, _ := os.Open("input.txt") scanner := bufio.NewScanner(file) input := make([]int, 0, 100) for scanner.Scan() { val, _ := strconv.Atoi(scanner.Text()) input = append(input, val) } file.Close() result := Task1(input) fmt.Printf("Task 1: %d\n", result) result = Task2(input) fmt.Printf("Task 2: %d\n", result) }