package day06 import ( "fmt" "math" ) type Input struct { Time uint64 Distance uint64 } func Part1(input string) int { answer := 1.0 ins := parseInput1(input) for _, in := range ins { t1, t2, _ := solveQuadratic(1, float64(in.Time) * -1, float64(in.Distance)) fmt.Printf("t1: %v t2: %v ans: %v\n", t1, t2, (t1 - t2 + 1)) answer *= (t1 - t2 + 1) } return int(answer) } func Part2(input string) int { answer := 1.0 ins := parseInput2(input) for _, in := range ins { t1, t2, _ := solveQuadratic(1, float64(in.Time) * -1, float64(in.Distance)) fmt.Printf("t1: %v t2: %v ans: %v\n", t1, t2, (t1 - t2 + 1)) answer *= (t1 - t2 + 1) } return int(answer)} func parseInput1(input string) []Input { var in []Input in = append(in, Input{46, 214}) in = append(in, Input{80, 1177}) in = append(in, Input{78, 1402}) in = append(in, Input{66, 1024}) return in } func parseInput2(input string) []Input { var in []Input in = append(in, Input{46807866, 214117714021024}) return in } func solveQuadratic(a, b, c float64) (float64, float64, error) { // Calculate the discriminant discriminant := b*b - 4*a*c // Check if the discriminant is non-negative if discriminant < 0 { return 0, 0, fmt.Errorf("no real roots, discriminant is negative") } // Calculate the roots root1 := (-b + math.Sqrt(discriminant)) / (2 * a) root2 := (-b - math.Sqrt(discriminant)) / (2 * a) if isWholeNumber(root1) { root1 = root1 - 1.0 } if isWholeNumber(root2) { root2 = root2 + 1.0 } return math.Floor(root1), math.Ceil(root2), nil } func isWholeNumber(x float64) bool { rounded := math.Round(x) return x == rounded }