Day 8 solution

I had fun with this one. I liked how straightforward it was, and it's always satisfying to see the code print a message visually when you're done.
This commit is contained in:
2022-06-16 08:24:56 -05:00
parent d129e52c70
commit b321fb87ec
4 changed files with 105 additions and 0 deletions

102
days/08.go Normal file
View File

@ -0,0 +1,102 @@
package days
import (
"fmt"
"math"
"strings"
"parnic.com/aoc2019/utilities"
)
type Day08 struct {
img [][]int
}
const (
imgWidth = 25
imgHeight = 6
)
func (d *Day08) Parse() {
contents := utilities.GetStringContents("08p")
imgSize := imgWidth * imgHeight
layers := len(contents) / imgSize
d.img = make([][]int, layers)
for layer := 0; layer < layers; layer++ {
d.img[layer] = make([]int, imgSize)
for i := 0; i < imgSize; i++ {
d.img[layer][i] = int(contents[(layer*imgSize)+i] - '0')
}
}
}
func (d Day08) Num() int {
return 8
}
func (d *Day08) Part1() string {
fewestZeroes := math.MaxInt
var layerFewestZeroes int
for layer := range d.img {
zeroes := 0
for i := range d.img[layer] {
if d.img[layer][i] == 0 {
zeroes++
}
}
if zeroes < fewestZeroes {
fewestZeroes = zeroes
layerFewestZeroes = layer
}
}
numOne := 0
numTwo := 0
for i := range d.img[layerFewestZeroes] {
if d.img[layerFewestZeroes][i] == 1 {
numOne++
} else if d.img[layerFewestZeroes][i] == 2 {
numTwo++
}
}
return fmt.Sprintf("Fewest zeroes on layer %d, #1s * #2s = %d * %d = %s%d%s",
layerFewestZeroes,
numOne,
numTwo,
utilities.TextBold,
numOne*numTwo,
utilities.TextReset,
)
}
func (d *Day08) Part2() string {
imgSize := imgWidth * imgHeight
finalImg := make([]int, imgSize)
for i := 0; i < imgSize; i++ {
for layer := 0; layer < len(d.img); layer++ {
if d.img[layer][i] != 2 {
finalImg[i] = d.img[layer][i]
break
}
}
}
outStr := strings.Builder{}
outStr.WriteString("Message received:\n")
outStr.WriteString(utilities.TextBold)
for y := 0; y < imgHeight; y++ {
for x := 0; x < imgWidth; x++ {
if finalImg[(y*imgWidth)+x] == 0 {
outStr.WriteRune(' ')
} else {
outStr.WriteRune('█')
}
}
outStr.WriteRune('\n')
}
outStr.WriteString(utilities.TextReset)
return outStr.String()
}

1
inputs/08p.txt Normal file

File diff suppressed because one or more lines are too long

1
inputs/08s1.txt Normal file
View File

@ -0,0 +1 @@
123456789012

View File

@ -38,6 +38,7 @@ var dayMap = []day{
&days.Day05{},
&days.Day06{},
&days.Day07{},
&days.Day08{},
}
func main() {