Solutions for day 10.
This commit is contained in:
parent
e47b6c4a45
commit
28998c5d14
|
@ -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
31
2018/day10-2.go
Normal 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++
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user