package main import ( "fmt" h "git.bullercodeworks.com/brian/adventofcode/helpers" ) func main() { inp := h.StdinToStringSlice() enhancement, inputImage := inp[0], h.StringSliceToCoordByteMap(inp[2:]) fmt.Println("# Part 1") run(inputImage, enhancement, 2) fmt.Println() fmt.Println("# Part 2") run(inputImage, enhancement, 50) } func run(image h.CoordByteMap, enhancement string, iters int) { bg := byte('.') for i := 0; i < iters; i++ { image = enhance(image, enhancement, bg) if bg == '#' { bg = enhancement[511] } else { bg = enhancement[0] } } fmt.Println("Lit pixels:", image.Count('#')) } func enhance(image h.CoordByteMap, enhancement string, bg byte) h.CoordByteMap { pxToInt := func(c h.Coordinate) int { var num int for bldY := c.Y - 1; bldY <= c.Y+1; bldY++ { for bldX := c.X - 1; bldX <= c.X+1; bldX++ { num = num << 1 v := image.Opt(h.Coordinate{X: bldX, Y: bldY}, bg) if v == '#' { num |= 1 } } } return num } next := h.NewCoordByteMap() for y := image.TLY - 1; y <= image.BRY+1; y++ { for x := image.TLX - 1; x <= image.BRX+1; x++ { c := h.Coordinate{X: x, Y: y} nv := enhancement[pxToInt(c)] next.Put(c, nv) } } return next }