mirror of
https://github.com/Crocmagnon/advent-of-code.git
synced 2024-10-18 14:53:22 +02:00
64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
|
package _023
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"math"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func Day06Part1(input io.Reader) (int, error) {
|
||
|
scanner := bufio.NewScanner(input)
|
||
|
|
||
|
scanner.Scan()
|
||
|
times := lineToInts(strings.TrimPrefix(scanner.Text(), "Time:"))
|
||
|
scanner.Scan()
|
||
|
distances := lineToInts(strings.TrimPrefix(scanner.Text(), "Distance:"))
|
||
|
fmt.Println(times, distances)
|
||
|
|
||
|
margin := 1
|
||
|
|
||
|
for i := 0; i < len(times); i++ {
|
||
|
x1, x2 := zeros(times[i], distances[i])
|
||
|
if distance(x1, times[i]) <= distances[i] {
|
||
|
x1++
|
||
|
}
|
||
|
margin *= x2 - x1
|
||
|
}
|
||
|
|
||
|
return margin, nil
|
||
|
}
|
||
|
|
||
|
func zeros(time, distance int) (int, int) {
|
||
|
t, d := float64(time), float64(distance)
|
||
|
delta := math.Sqrt(math.Pow(t, 2) - 4*d)
|
||
|
return int(math.Ceil((t - delta) / 2)), int(math.Ceil((t + delta) / 2))
|
||
|
}
|
||
|
|
||
|
func distance(timePress, timeMax int) int {
|
||
|
return timePress * (timeMax - timePress)
|
||
|
}
|
||
|
|
||
|
func Day06Part2(input io.Reader) (int, error) {
|
||
|
scanner := bufio.NewScanner(input)
|
||
|
|
||
|
scanner.Scan()
|
||
|
times := lineToInts(strings.ReplaceAll(strings.TrimPrefix(scanner.Text(), "Time:"), " ", ""))
|
||
|
scanner.Scan()
|
||
|
distances := lineToInts(strings.ReplaceAll(strings.TrimPrefix(scanner.Text(), "Distance:"), " ", ""))
|
||
|
fmt.Println(times, distances)
|
||
|
|
||
|
margin := 1
|
||
|
|
||
|
for i := 0; i < len(times); i++ {
|
||
|
x1, x2 := zeros(times[i], distances[i])
|
||
|
if distance(x1, times[i]) <= distances[i] {
|
||
|
x1++
|
||
|
}
|
||
|
margin *= x2 - x1
|
||
|
}
|
||
|
|
||
|
return margin, nil
|
||
|
}
|