56 lines
951 B
Go
56 lines
951 B
Go
|
package main
|
||
|
|
||
|
import "math"
|
||
|
|
||
|
type Coordinate [4]int
|
||
|
|
||
|
func (c Coordinate) Distance(b Coordinate) int {
|
||
|
sum := 0
|
||
|
for i := 0; i < 4; i++ {
|
||
|
sum += abs(c[i] - b[i])
|
||
|
}
|
||
|
return sum
|
||
|
}
|
||
|
|
||
|
type Constellation map[Coordinate]struct{}
|
||
|
|
||
|
func (c Constellation) Distance(b Coordinate) int {
|
||
|
shortestDistance := math.MaxInt64
|
||
|
|
||
|
for p := range c {
|
||
|
if p.Distance(b) < shortestDistance {
|
||
|
shortestDistance = p.Distance(b)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return shortestDistance
|
||
|
}
|
||
|
|
||
|
func (c Constellation) CelestialDistance(b Constellation) int {
|
||
|
shortestDistance := math.MaxInt64
|
||
|
|
||
|
for p := range c {
|
||
|
if b.Distance(p) < shortestDistance {
|
||
|
shortestDistance = b.Distance(p)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return shortestDistance
|
||
|
}
|
||
|
|
||
|
func (c Constellation) Add(b Coordinate) {
|
||
|
c[b] = struct{}{}
|
||
|
}
|
||
|
|
||
|
func (c Constellation) Merge(b Constellation) {
|
||
|
for p := range b {
|
||
|
c[p] = struct{}{}
|
||
|
delete(b, p)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func NewConstellation(b Coordinate) Constellation {
|
||
|
c := Constellation{b: struct{}{}}
|
||
|
return c
|
||
|
}
|