Files
adventofcode/2023/go/day06/day06.go
2023-12-06 13:17:46 +00:00

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
}