Solutions for day 10.

This commit is contained in:
Anna Rose 2018-12-12 15:06:32 -05:00
parent e47b6c4a45
commit 28998c5d14
No known key found for this signature in database
GPG Key ID: 8D9ACA841015C59A
4 changed files with 67 additions and 18 deletions

View File

@ -1,8 +1,6 @@
package main
import (
"fmt"
"internal/day10"
"internal/util"
)
@ -11,27 +9,21 @@ func main() {
data := util.ReadInput()
points := day10.ParseInput(data)
i := 0 // debug
lowest := day10.CalculateRange(points)
for {
for _, point := range points {
point.Move()
}
groups := day10.GroupPoints(points)
if groups != nil {
for _, group := range groups {
day10.DrawPoints(group)
fmt.Println()
newRange := day10.CalculateRange(points)
if newRange < lowest {
lowest = newRange
} else {
for _, point := range points {
point.Reverse()
}
day10.DrawPoints(points)
return
}
// debug
i++
if i > 100000 {
fmt.Println("oops")
return
}
// end debug
}
}

31
2018/day10-2.go Normal file
View File

@ -0,0 +1,31 @@
package main
import (
"fmt"
"internal/day10"
"internal/util"
)
func main() {
data := util.ReadInput()
points := day10.ParseInput(data)
lowest := day10.CalculateRange(points)
i := 0
for {
for _, point := range points {
point.Move()
}
newRange := day10.CalculateRange(points)
if newRange < lowest {
lowest = newRange
} else {
fmt.Println(i)
return
}
i++
}
}

View File

@ -1,5 +1,11 @@
// Unused solution: yes, this is a SECOND failed solution. Left here as a testament
// to... something. The actual solution uses CalculateRange from point.go
package day10
import (
"sort"
)
// GroupPoints creates groups of points, then sorts them and returns the sorted list
// A 'group' is a series of points that are adjacent to each other.
// If this function finds any non-adjacent points, it returns nil.
@ -36,7 +42,12 @@ func GroupPoints(points []*Point) [][]*Point {
groups = append(groups, group)
}
// TODO: sort the groups
// sort the groups
sort.Slice(groups[:], func(i, j int) bool {
xMin1, _, _, _ := findBounds(groups[i])
xMin2, _, _, _ := findBounds(groups[j])
return xMin1 < xMin2
})
return groups
}

View File

@ -14,6 +14,16 @@ func (p *Point) Move() {
p.Y += p.Yv
}
func (p *Point) Reverse() {
p.X -= p.Xv
p.Y -= p.Yv
}
func CalculateRange(points []*Point) int {
xMin, xMax, yMin, yMax := findBounds(points)
return xMax - xMin + yMax - yMin
}
func DrawPoints(points []*Point) {
pointArr := makeBuffer(points)
@ -33,7 +43,11 @@ func DrawPoints(points []*Point) {
// findBounds returns xMin, xMax, yMin, and yMax from the provided points.
func findBounds(points []*Point) (int, int, int, int) {
// find min and max values
var xMin, xMax, yMin, yMax int
xMin := points[0].X
xMax := points[0].X
yMin := points[0].Y
yMax := points[0].Y
for _, point := range points {
if point.X < xMin {
xMin = point.X
@ -54,6 +68,7 @@ func findBounds(points []*Point) (int, int, int, int) {
func makeBuffer(points []*Point) [][]byte {
xMin, xMax, yMin, yMax := findBounds(points)
// get the total magnitude; we'll do adjustments later
xRange := xMax - xMin
yRange := yMax - yMin