2023 Day 24 Complete!
This commit is contained in:
parent
2e01de882d
commit
bdba3a2268
@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -43,7 +44,6 @@ func part2(inp []string) {
|
|||||||
fmt.Println(findThrow(all))
|
fmt.Println(findThrow(all))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/rumkugel13/AdventOfCode2023/blob/main/day24.go#L139
|
|
||||||
func findThrow(all []*hailstone) int {
|
func findThrow(all []*hailstone) int {
|
||||||
maybeX, maybeY, maybeZ := []int{}, []int{}, []int{}
|
maybeX, maybeY, maybeZ := []int{}, []int{}, []int{}
|
||||||
for i := 0; i < len(all)-1; i++ {
|
for i := 0; i < len(all)-1; i++ {
|
||||||
@ -51,10 +51,59 @@ func findThrow(all []*hailstone) int {
|
|||||||
a, b := all[i], all[j]
|
a, b := all[i], all[j]
|
||||||
if a.DX == b.DX {
|
if a.DX == b.DX {
|
||||||
nextMaybe := findMatchingVelocity(int(b.X-a.X), int(a.DX))
|
nextMaybe := findMatchingVelocity(int(b.X-a.X), int(a.DX))
|
||||||
|
if len(maybeX) == 0 {
|
||||||
|
maybeX = nextMaybe
|
||||||
|
} else {
|
||||||
|
maybeX = getIntersect(maybeX, nextMaybe)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if a.DY == b.DY {
|
||||||
|
nextMaybe := findMatchingVelocity(int(b.Y-a.Y), int(a.DY))
|
||||||
|
if len(maybeY) == 0 {
|
||||||
|
maybeY = nextMaybe
|
||||||
|
} else {
|
||||||
|
maybeY = getIntersect(maybeY, nextMaybe)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if a.DZ == b.DZ {
|
||||||
|
nextMaybe := findMatchingVelocity(int(b.Z-a.Z), int(a.DZ))
|
||||||
|
if len(maybeZ) == 0 {
|
||||||
|
maybeZ = nextMaybe
|
||||||
|
} else {
|
||||||
|
maybeZ = getIntersect(maybeZ, nextMaybe)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(maybeX) == len(maybeY) && len(maybeY) == len(maybeZ) && len(maybeZ) == 1 {
|
||||||
|
rockVel := hailstone{
|
||||||
|
X: float64(maybeX[0]), Y: float64(maybeY[0]), Z: float64(maybeZ[0]),
|
||||||
|
}
|
||||||
|
hailA, hailB := all[0], all[1]
|
||||||
|
mA := (hailA.DY - rockVel.Y) / (hailA.DX - rockVel.X)
|
||||||
|
mB := (hailB.DY - rockVel.Y) / (hailB.DX - rockVel.X)
|
||||||
|
cA := hailA.Y - (mA * hailA.X)
|
||||||
|
cB := hailB.Y - (mB * hailB.X)
|
||||||
|
xPos := (cB - cA) / (mA - mB)
|
||||||
|
yPos := mA*xPos + cA
|
||||||
|
time := (xPos - hailA.X) / (hailA.DX - rockVel.X)
|
||||||
|
zPos := hailA.Z + (hailA.DZ-rockVel.Z)*time
|
||||||
|
return int(xPos + yPos + zPos)
|
||||||
|
}
|
||||||
|
return h.MIN_INT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getIntersect(a, b []int) []int {
|
||||||
|
result := []int{}
|
||||||
|
for _, val := range a {
|
||||||
|
if slices.Contains(b, val) {
|
||||||
|
result = append(result, val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
func findMatchingVelocity(diff, vel int) []int {
|
func findMatchingVelocity(diff, vel int) []int {
|
||||||
match := []int{}
|
match := []int{}
|
||||||
for v := -1000; v < 1000; v++ {
|
for v := -1000; v < 1000; v++ {
|
||||||
|
Loading…
Reference in New Issue
Block a user