package main
import (
"bufio"
"fmt"
"os"
"github.com/davecgh/go-spew/spew"
)
/*
type ByInit []Group
func (b ByInit) Len() int {
return len(b)
}
func (b ByInit) Swap(i, j int) {
b[i], b[j] = b[j], b[i]
}
func (b ByInit) Less(i, j int) bool {
return b[i].Initiative > b[j].Initiative
}
*/
func waitEnter() {
fmt.Printf("Press ENTER to continue\n")
bufio.NewReader(os.Stdin).ReadBytes('\n')
}
func sliceEqual(a, b []int) bool {
if len(a) != len(b) {
return false
}
for t := range a {
if a[t] != b[t] {
return false
}
}
return true
}
func abs(a int) int {
if a < 0 {
a = -a
}
return a
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func manhattan(a, b Point) int {
return abs(a.X-b.X) + abs(a.Y-b.Y) + abs(a.Z-b.Z) + abs(a.W-b.W)
}
func inSlice(a string, b []string) bool {
for _, c := range b {
if a == c {
return true
}
}
return false
}
type Point struct {
X, Y, Z, W int
C int
}
type Puzzle struct {
Points []Point
}
func NewPuzzle(filepath string) *Puzzle {
p := Puzzle{
Points: make([]Point, 0, 100),
}
input, err := os.Open(filepath)
if err != nil {
panic(err.Error())
}
scanner := bufio.NewScanner(input)
count := 0
for scanner.Scan() {
var x, y, z, w int
fmt.Sscanf(scanner.Text(), "%d,%d,%d,%d", &x, &y, &z, &w)
p.Points = append(p.Points, Point{x, y, z, w, count})
count++
}
if err := scanner.Err(); err != nil {
panic(err.Error())
}
input.Close()
for i := 0; i < len(p.Points); i++ {
pi := p.Points[i]
for j := i + 1; j < len(p.Points); j++ {
pj := p.Points[j]
if manhattan(pi, pj) <= 3 && pi.C != pj.C {
for k := 0; k < len(p.Points); k++ {
if p.Points[k].C == pj.C {
p.Points[k].C = pi.C
}
}
}
}
}
return &p
}
func (p *Puzzle) Part1() int {
constellations := make(map[int]struct{})
for _, p := range p.Points {
constellations[p.C] = struct{}{}
}
return len(constellations)
}
func main() {
p := NewPuzzle("input.txt")
spew.Dump(p)
fmt.Println(p.Part1())
}