71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
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
|
|
} |