78 lines
1.4 KiB
Go
78 lines
1.4 KiB
Go
|
package day10
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
type Point struct {
|
||
|
X, Y int
|
||
|
Xv, Yv int
|
||
|
}
|
||
|
|
||
|
func (p *Point) Move() {
|
||
|
p.X += p.Xv
|
||
|
p.Y += p.Yv
|
||
|
}
|
||
|
|
||
|
func DrawPoints(points []*Point) {
|
||
|
pointArr := makeBuffer(points)
|
||
|
|
||
|
// print the buffer
|
||
|
for y := 0; y < len(pointArr[0]); y++ {
|
||
|
for x := 0; x < len(pointArr); x++ {
|
||
|
if pointArr[x][y] != 0 {
|
||
|
fmt.Printf("%c", pointArr[x][y])
|
||
|
} else {
|
||
|
fmt.Printf(".")
|
||
|
}
|
||
|
}
|
||
|
fmt.Println()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 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
|
||
|
for _, point := range points {
|
||
|
if point.X < xMin {
|
||
|
xMin = point.X
|
||
|
}
|
||
|
if point.X > xMax {
|
||
|
xMax = point.X
|
||
|
}
|
||
|
if point.Y < yMin {
|
||
|
yMin = point.Y
|
||
|
}
|
||
|
if point.Y > yMax {
|
||
|
yMax = point.Y
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return xMin, xMax, yMin, yMax
|
||
|
}
|
||
|
|
||
|
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
|
||
|
|
||
|
// construct the buffer
|
||
|
pointArr := make([][]byte, xRange+1)
|
||
|
for i := 0; i < len(pointArr); i++ {
|
||
|
pointArr[i] = make([]byte, yRange+1)
|
||
|
}
|
||
|
|
||
|
// put the points into the buffer
|
||
|
for _, p := range points {
|
||
|
// the x and y values are adjusted by the mins
|
||
|
x := p.X - xMin
|
||
|
y := p.Y - yMin
|
||
|
|
||
|
pointArr[x][y] = '#'
|
||
|
}
|
||
|
|
||
|
return pointArr
|
||
|
}
|