Commiting day25. Not done though
This commit is contained in:
parent
663e19ba54
commit
bd274c826c
160
2018/day25/day25.go
Normal file
160
2018/day25/day25.go
Normal file
@ -0,0 +1,160 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"math"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var grid *Grid
|
||||
|
||||
// Pt 1
|
||||
// 431 too high
|
||||
func main() {
|
||||
input := stdinToStringSlice()
|
||||
grid = &Grid{}
|
||||
for _, v := range input {
|
||||
grid.addPoint(v)
|
||||
}
|
||||
last := len(grid.constellations)
|
||||
for grid.checkMerges() {
|
||||
fmt.Println("++ merge ++ ", len(grid.constellations))
|
||||
if len(grid.constellations) == last {
|
||||
break
|
||||
}
|
||||
last = len(grid.constellations)
|
||||
}
|
||||
fmt.Println("Points:", len(grid.points))
|
||||
fmt.Println("Constellations:", len(grid.constellations))
|
||||
}
|
||||
|
||||
type Grid struct {
|
||||
points []*Pos
|
||||
constellations []*Constellation
|
||||
}
|
||||
|
||||
func (g *Grid) checkMerges() bool {
|
||||
for ci, c := range g.constellations {
|
||||
for _, p := range c.points {
|
||||
for wrki, wrk := range g.constellations {
|
||||
if wrki == ci {
|
||||
continue
|
||||
}
|
||||
if wrk.should(p) {
|
||||
g.merge(ci, wrki)
|
||||
g.remove(wrki)
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println("Nothing merged")
|
||||
return false
|
||||
}
|
||||
|
||||
func (g *Grid) addPoint(inp string) {
|
||||
pts := strings.Split(inp, ",")
|
||||
pt := &Pos{
|
||||
x: atoi(pts[0]),
|
||||
y: atoi(pts[1]),
|
||||
z: atoi(pts[2]),
|
||||
t: atoi(pts[3]),
|
||||
}
|
||||
g.points = append(g.points, pt)
|
||||
|
||||
// Check if this point is within 3 from any other points
|
||||
cIdx := -1
|
||||
var mergedIdx []int
|
||||
for i, v := range g.constellations {
|
||||
if v.should(pt) {
|
||||
if cIdx >= 0 {
|
||||
g.merge(cIdx, i)
|
||||
mergedIdx = append(mergedIdx, i)
|
||||
} else {
|
||||
cIdx = i
|
||||
g.constellations[cIdx].add(pt)
|
||||
}
|
||||
}
|
||||
}
|
||||
for i := range mergedIdx {
|
||||
g.remove(i)
|
||||
}
|
||||
if cIdx == -1 {
|
||||
c := &Constellation{}
|
||||
c.add(pt)
|
||||
g.constellations = append(g.constellations, c)
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Grid) merge(c1Idx, c2Idx int) error {
|
||||
fmt.Println(" Merging", c1Idx, c2Idx)
|
||||
if c1Idx >= len(g.constellations) || c2Idx >= len(g.constellations) {
|
||||
return errors.New("Invalid Constellation Index")
|
||||
}
|
||||
for _, v := range g.constellations[c2Idx].points {
|
||||
g.constellations[c1Idx].add(v)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *Grid) remove(remIdx int) error {
|
||||
if remIdx >= len(g.constellations) {
|
||||
return errors.New("Invalid Constellation Index")
|
||||
}
|
||||
g.constellations = append(g.constellations[:remIdx], g.constellations[remIdx+1:]...)
|
||||
return nil
|
||||
}
|
||||
|
||||
type Constellation struct {
|
||||
points []*Pos
|
||||
}
|
||||
|
||||
func (c *Constellation) should(p *Pos) bool {
|
||||
for _, v := range c.points {
|
||||
if v.to(p) <= 3 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (c *Constellation) add(p *Pos) {
|
||||
p.constellation = c
|
||||
c.points = append(c.points, p)
|
||||
}
|
||||
|
||||
type Pos struct {
|
||||
x, y, z, t int
|
||||
constellation *Constellation
|
||||
}
|
||||
|
||||
func (p *Pos) to(p2 *Pos) int {
|
||||
xs := math.Abs(float64(p.x) - float64(p2.x))
|
||||
ys := math.Abs(float64(p.y) - float64(p2.y))
|
||||
zs := math.Abs(float64(p.z) - float64(p2.z))
|
||||
ts := math.Abs(float64(p.t) - float64(p2.t))
|
||||
return int(xs + ys + zs + ts)
|
||||
}
|
||||
|
||||
func stdinToStringSlice() []string {
|
||||
var input []string
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
for scanner.Scan() {
|
||||
input = append(input, scanner.Text())
|
||||
}
|
||||
return input
|
||||
}
|
||||
|
||||
func atoi(i string) int {
|
||||
var ret int
|
||||
var err error
|
||||
if ret, err = strconv.Atoi(i); err != nil {
|
||||
log.Fatal("Invalid Atoi: " + i)
|
||||
}
|
||||
return ret
|
||||
}
|
1315
2018/day25/input
Normal file
1315
2018/day25/input
Normal file
File diff suppressed because it is too large
Load Diff
8
2018/day25/testinput1
Normal file
8
2018/day25/testinput1
Normal file
@ -0,0 +1,8 @@
|
||||
0,0,0,0
|
||||
3,0,0,0
|
||||
0,3,0,0
|
||||
0,0,3,0
|
||||
0,0,0,3
|
||||
0,0,0,6
|
||||
9,0,0,0
|
||||
12,0,0,0
|
10
2018/day25/testinput2
Normal file
10
2018/day25/testinput2
Normal file
@ -0,0 +1,10 @@
|
||||
-1,2,2,0
|
||||
0,0,2,-2
|
||||
0,0,0,-2
|
||||
-1,2,0,0
|
||||
-2,-2,-2,2
|
||||
3,0,2,-1
|
||||
-1,3,2,2
|
||||
-1,0,-1,0
|
||||
0,2,1,-2
|
||||
3,0,0,0
|
10
2018/day25/testinput3
Normal file
10
2018/day25/testinput3
Normal file
@ -0,0 +1,10 @@
|
||||
1,-1,0,1
|
||||
2,0,-1,0
|
||||
3,2,-1,0
|
||||
0,0,3,1
|
||||
0,0,-1,-1
|
||||
2,3,-2,0
|
||||
-2,2,0,0
|
||||
2,-2,0,-1
|
||||
1,-1,0,-1
|
||||
3,2,0,2
|
10
2018/day25/testinput4
Normal file
10
2018/day25/testinput4
Normal file
@ -0,0 +1,10 @@
|
||||
1,-1,-1,-2
|
||||
-2,-2,0,1
|
||||
0,2,1,3
|
||||
-2,3,-2,1
|
||||
0,2,3,-2
|
||||
-1,-1,1,-2
|
||||
0,-2,-1,0
|
||||
-2,2,3,-1
|
||||
1,2,2,0
|
||||
-1,-2,0,-2
|
Loading…
Reference in New Issue
Block a user