58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
// Package estimator provides model and methods
|
|
// for answering questions about cable needs
|
|
// for connecting junction boxes.
|
|
package estimator
|
|
|
|
import (
|
|
"slices"
|
|
|
|
"github.com/StevanFreeborn/advent-of-code-2025/cmd/08/box"
|
|
"github.com/StevanFreeborn/advent-of-code-2025/cmd/08/circuitMap"
|
|
"github.com/StevanFreeborn/advent-of-code-2025/cmd/08/connection"
|
|
)
|
|
|
|
type Estimator interface {
|
|
PossibleConnections() []connection.Connection
|
|
CreateMap() circuitMap.CircuitMap
|
|
}
|
|
|
|
type estimator struct {
|
|
possibleConnections []connection.Connection
|
|
boxes []box.Box
|
|
}
|
|
|
|
func From(boxes []box.Box) Estimator {
|
|
return estimator{
|
|
boxes: boxes,
|
|
possibleConnections: createAllPossibleConnections(boxes),
|
|
}
|
|
}
|
|
|
|
func (e estimator) PossibleConnections() []connection.Connection {
|
|
return e.possibleConnections
|
|
}
|
|
|
|
func (e estimator) CreateMap() circuitMap.CircuitMap {
|
|
return circuitMap.From(e.boxes)
|
|
}
|
|
|
|
func createAllPossibleConnections(boxes []box.Box) []connection.Connection {
|
|
connections := []connection.Connection{}
|
|
numOfBoxes := len(boxes)
|
|
|
|
for i := range numOfBoxes {
|
|
for j := i + 1; j < numOfBoxes; j++ {
|
|
start := boxes[i]
|
|
end := boxes[j]
|
|
conn := connection.From(start, end)
|
|
connections = append(connections, conn)
|
|
}
|
|
}
|
|
|
|
slices.SortFunc(connections, func(a connection.Connection, b connection.Connection) int {
|
|
return int(a.Distance() - b.Distance())
|
|
})
|
|
|
|
return connections
|
|
}
|