adventofcode/2021/day13/main.go

80 lines
1.6 KiB
Go

package main
import (
"fmt"
"strings"
h "git.bullercodeworks.com/brian/adventofcode/helpers"
)
func main() {
inp := h.StdinToStringSlice()
dots := h.CoordByteMap{
Field: make(map[h.Coordinate]byte),
}
var folds []h.Coordinate
var inst bool
for i := range inp {
if inst {
// folding instructions
pts := strings.Split(inp[i], "=")
v := h.Atoi(pts[1])
if pts[0][len(pts[0])-1] == 'x' {
folds = append(folds, h.Coordinate{X: v, Y: -1})
} else {
folds = append(folds, h.Coordinate{X: -1, Y: v})
}
} else if inp[i] == "" {
inst = true
} else {
// A dot
pts := strings.Split(inp[i], ",")
c := h.Coordinate{X: h.Atoi(pts[0]), Y: h.Atoi(pts[1])}
dots.Put(c, '#')
}
}
fmt.Println("# Part 1")
fmt.Println(len(doFolds(dots, []h.Coordinate{folds[0]}).Field))
fmt.Println()
fmt.Println("# Part 2")
dots = doFolds(dots, folds)
fmt.Println("Total Dots:", len(dots.Field))
for y := 0; y < dots.Height; y++ {
for x := 0; x < dots.Width; x++ {
b := dots.Get(h.Coordinate{X: x, Y: y})
if b != 0 {
fmt.Print("▓")
} else {
fmt.Print(" ")
}
}
fmt.Print("\n")
}
}
func doFolds(dots h.CoordByteMap, folds []h.Coordinate) h.CoordByteMap {
for i := range folds {
newDots := h.CoordByteMap{
Field: make(map[h.Coordinate]byte),
}
if folds[i].X != -1 {
for k := range dots.Field {
if k.X > folds[i].X {
k.X = folds[i].X - (k.X - folds[i].X)
}
newDots.Put(k, '#')
}
} else if folds[i].Y != -1 {
for k := range dots.Field {
if k.Y > folds[i].Y {
k.Y = folds[i].Y - (k.Y - folds[i].Y)
}
newDots.Put(k, '#')
}
}
dots = newDots
}
return dots
}