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 package main
import ( import (
"fmt"
"internal/day10" "internal/day10"
"internal/util" "internal/util"
) )
@ -11,27 +9,21 @@ func main() {
data := util.ReadInput() data := util.ReadInput()
points := day10.ParseInput(data) points := day10.ParseInput(data)
i := 0 // debug lowest := day10.CalculateRange(points)
for { for {
for _, point := range points { for _, point := range points {
point.Move() point.Move()
} }
groups := day10.GroupPoints(points) newRange := day10.CalculateRange(points)
if groups != nil { if newRange < lowest {
for _, group := range groups { lowest = newRange
day10.DrawPoints(group) } else {
fmt.Println() for _, point := range points {
point.Reverse()
} }
day10.DrawPoints(points)
return 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 package day10
import (
"sort"
)
// GroupPoints creates groups of points, then sorts them and returns the sorted list // 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. // A 'group' is a series of points that are adjacent to each other.
// If this function finds any non-adjacent points, it returns nil. // If this function finds any non-adjacent points, it returns nil.
@ -36,7 +42,12 @@ func GroupPoints(points []*Point) [][]*Point {
groups = append(groups, group) 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 return groups
} }

View File

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