Files
practice/pkg/car_fleet/main.go
2025-12-23 23:55:44 -05:00

86 lines
1.4 KiB
Go

package car_fleet
import (
"fmt"
"math"
"slices"
)
type Car struct {
position int
speed int
}
func (c Car) CollidesInto(o Car) float64 {
if c.speed == o.speed {
return math.Inf(1)
}
return float64(c.position-o.position) / float64(o.speed-c.speed)
}
func (c Car) At(time int) int {
return c.position + c.speed*time
}
type CarSpace struct {
car Car
from float64
to float64
}
func (s CarSpace) Contains(point float64) bool {
return point >= float64(s.from) && point <= float64(s.to)
}
func sortByInversePosition(a Car, b Car) int {
return b.position - a.position
}
func CarFleet(target int, position []int, speed []int) int {
cars := []Car{}
ends := map[int]bool{}
for i := range position {
cars = append(cars, Car{
position: position[i],
speed: speed[i],
})
}
slices.SortFunc(cars, sortByInversePosition)
stack := []CarSpace{}
for _, car := range cars {
for {
fmt.Println(car, stack)
if len(stack) == 0 {
stack = append(stack, CarSpace{
car: car,
from: 0,
to: float64(target),
})
break
}
top := stack[len(stack)-1]
time := car.CollidesInto(top.car)
if top.Contains(time) {
stack[len(stack)-1].from = time
stack = append(stack, CarSpace{
car: car,
from: 0,
to: time,
})
break
}
stack = stack[:len(stack)-1]
}
ending_at := stack[0].car.At(target)
ends[ending_at] = true
}
return len(ends)
}