solve day 6 (with maths)

This commit is contained in:
Gabriel Augendre 2023-12-08 19:04:55 +01:00
parent fa66368b91
commit 976d3b5e01
6 changed files with 115 additions and 14 deletions

View file

@ -4,7 +4,6 @@ import (
"bufio"
"io"
"slices"
"strconv"
"strings"
)
@ -105,19 +104,6 @@ type day05SeedRange struct {
start, end int
}
func lineToInts(line string) []int {
values := strings.Split(line, " ")
ints := make([]int, len(values))
for i, value := range values {
number, err := strconv.Atoi(value)
if err != nil {
panic(err)
}
ints[i] = number
}
return ints
}
type day05Range struct {
destStart, sourceStart, length int
}

63
2023/day06_boats.go Normal file
View file

@ -0,0 +1,63 @@
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
}

25
2023/day06_boats_test.go Normal file
View file

@ -0,0 +1,25 @@
package _023
import (
"testing"
)
func TestDay06Part1(t *testing.T) {
tests := []testCase{
{"inputs/day06_test1", 288},
{"inputs/day06", 1660968},
}
for _, test := range tests {
t.Run(test.filename, check(test, Day06Part1))
}
}
func TestDay06Part2(t *testing.T) {
tests := []testCase{
{"inputs/day06_test1", 71503},
{"inputs/day06", 26499773},
}
for _, test := range tests {
t.Run(test.filename, check(test, Day06Part2))
}
}

2
2023/inputs/day06 Normal file
View file

@ -0,0 +1,2 @@
Time: 47 98 66 98
Distance: 400 1213 1011 1540

2
2023/inputs/day06_test1 Normal file
View file

@ -0,0 +1,2 @@
Time: 7 15 30
Distance: 9 40 200

23
2023/lib.go Normal file
View file

@ -0,0 +1,23 @@
package _023
import (
"regexp"
"strconv"
"strings"
)
var reg = regexp.MustCompile(`\s+`)
func lineToInts(line string) []int {
line = strings.TrimSpace(line)
values := reg.Split(line, -1)
ints := make([]int, len(values))
for i, value := range values {
number, err := strconv.Atoi(value)
if err != nil {
panic(err)
}
ints[i] = number
}
return ints
}