~zacbrown/aoc-2019-go

247d6fcff1f932df0570698f2f72f80c47af75f5 — Zac Brown 4 years ago 67561ff
Day 8, part 1 complete.
3 files changed, 108 insertions(+), 0 deletions(-)

A cmd/day8/image_data.txt
A cmd/day8/main.go
A cmd/day8/simple_image_data.txt
A cmd/day8/image_data.txt => cmd/day8/image_data.txt +1 -0
@@ 0,0 1,1 @@
222222120222222222222222222122222122221202220222121122222222222102222220222201222222222222222202221220202222222222220222222202222212210222222211222220222222221222222222222222222222222222220212222222220022222222222102222220222200222122222222222202220221222220222222222222222222222222200222222222222221222222020222222222222222222022222222221202222222221020222222222002222222222221222122222222222222222220222221222222222222222222222212211222222211222220222222220222222222222222222022222222221212221222222121222222222202222220222220222222222222222212220222222222222222221222222212222202202222222201222222222222122222222222222222222122222022222212220222222120222222222112222222022202222122222222222202221222202221222222221222222202222212202222222200222220222222221222222222222222222122222222222202222222222222222222222212222222022211222122222222222202222221222221222222220222222222222222200222222222222220222222122222222222222222222022222022220212221222122221222222222112222221022211222022222222222212222222222202222222221222222202222202222222222210222222222222220222222222222222222022222222222222210222222120222222222212222221022210222022222222222212220220202222222222220222222202222202200222222201222222222222122222222222222222222222222022222222222222120022222222222202222220222211222022222222222222220222202200222222222222222202222212200222222211222220222222021222222222222222222022222122222212210222120120222222222202222221222210222022222222222202221220212200222222220222222212222212220222222221222221222222221222222222222222222122222022221202220222120121222222222212222222120212222122222222222222221222212222222222220222222202222202222222222220222220222222221222222222222222222122222022221202222222022121222222222102222222122211222222222222222222222222212202222222221222222212222212221222222211222222222222022222212222222222222022222222220212202222022021222222222122222222220212222222222222222202220220212212222222220222222212222212220222222202212220222202220222222222222222222222222222221222221222020221222222222112222220221201222122222222222202220220212201222222222222222222222202200222222222212220222212220222202222222222222222222222222222200222222221222222222202222220021210222222222222222202220220202221222222220202222201222212201222222220212221222212022222202222222222222222222222220222220222222221212222222002222222020212222022222222222202220221202220222222222202222202222222210222222212222221222202122220202222222222222222222022220222212222222022222222222022222221220200222022222222222222220222202210222222220222222201222212200222222212212220222222222220212222222212222222222122222202211222221022222222222212222222220221222122222222222212220221212212222222222222222210222222221222222221202221222222122221202122222222222222222022220202212222021022222222222122222222022212222122222222222202220222202221222222220212222221222222200222222221202222222202121220212122222212222022222022222202212222021021222222222002222221022211222022222222222222220221202201222222220222222221222222211222222222212221222222022221212222222202222122222122221202200222221121202222222002222221221210222122222222222222220222202221222222221212222220222212212222222202202221222222122220222222222222222122222222220222210222121221212222222102212220220211222222222222222202221222212210222222221202222211222212202222222200202221222212122222222022222222222022222122222212210222020220202222222112202222121211222222222222222202221222212220222222222212222211222202212222222221202212222212122222222122222212222222202022220202222222220120222222222012222221020212222222222222222222222221202202222222222202222220222212220222222201222201222212121222212022222212222222212022222222221222020121202222222102202221220200222022222222222202220221222201222222221212222201222202221222222202222202222222121222202222222202222022222222222222220222022020222222222202202220020202222022222222222202220220202212222222222212222211022212212222222202222221222222121221222222222212222120212122222222222222020121222222222212202222220201222222222222222212221221212202222222222212222201022222221222222111202221222212120220222222222212222020222222200222221222121220222222222112222220221202222022222222222202221220212200222222222202222200022222201222222220212200222212122222222022222202222021212122212202202222020122212222222212222220220210222022222222222212222221222221222222220212222201122222201222222202220212222202122220222122222202222020202222200222211222021021222222222212212221221200222122222222222202221222202200222222221222222220022222202222222210212222222222220222222022222202222021222022201212220222021221212222222112202220222211222022222222222212222222222211222222221202222200222212220222222222201210222212122222202222222222222120202022210202211222020020212222202102212222121201222122222222222212221221212201222222220212222210122202211222222202211210222212022220202222222212222102202022201212220222121022222222222012212221221222222122222222222211220221220221222222222222222200022212201222222100221212222212220221222022222222222102212022210212200222020022202222202002212220220222222122222222222212221221200201222222222212222200122222220222222211221220222212221220222222222222222210222022220202222222221022222222202202202220220202222022222222222211221222201212222222221212222210022200022222221120211200222212120221222022222212222111222022210222201222021220202222202012202222021212222022222222222210222220202212222222220022222220022212200222221000200210222202022221202221222212222220222122201202220222020122202222222202222220222212222022222222022201222221210201222222222002222210122202120222220202211210222212020222222020222222222000202022002202202222222221212222212222222222222220222022222222222212221220212221222222221202222220122212000222222121200200222212222220202120222222222111212022122202202222221021212222222002212220021202222122222222022220220220211222222222222112222202002212011222220120212211222222120220202120222202222002202222022212201222022222222222222112212222221210222222222222222211222222212212222222222012222220222221021222222012211201222202221222202222222222222012202222222212202222121021212222202212212220021200202122222222022222220222202221222222221102222221022222101222222010202212222222121221212120222222222022222022210222222222220220202222202022222220220220222222222222222212221221222200222222220102222221002212200222221212221202222212022220222022222202220201222122211202211222220220202222202022202220022222212222222222122202221221222210202222220102222202112211000212221012220211222222121220202121222222222121202222121222212222120222212222222122222220020221202222222222022220222221202222212222221012222222122202000212220121202201222222021220202122222222220112202022221202210222120120202222212212212222021211222022222222022222220221211222202222221012222200222221012202222000201210222222020222212222222202222002212222222212220222222221202222202022212220021220202222222222122212220211210222212222222102222222202212011202221000222212222212221221222121222212221111222122212212201222120020212222202012202221122202202122212222022212221202201221202222221212222211112220011212221210200202222212122220222122222202221001212022222202201222020021222222222112212221020220222022212222022220222210220222212222220012222222112222000222221111221222222202122222212122222222221012222222212222211222120121222222202122222222122210212222212222122200222211212222212222221102222222122202020212221001201222222212221221222120222202220111222122001222221222220121202222202012202220122210222122202222122202222200201220202222220212222220112221222222221101210221222222021220222210222222221012212122200222021222221021202222222212202220222221202222222222022201220210212212202222221222222210102211100201222220211200222212122220202001222202220120222122012212002222021221202222202212202222021202212122222222222201220212221211222222222102222210002221101211222212201212222202120220202021222222220012212122001202102222121020222222212222202220222200022022212222122211222221222212202222221112222202112212122201220200200220222202021221212120222202222012212122221202111222221020212222212012202220120222212222202222022220221200222222202222221112222202022210010222221122220210222202220222222120222202220011202222212212020222022222222222212102212221022211112122202222022220222201221111222222222202222201222211021212220102202202222222021220202201222202220001202122020202110222022020222222222112222221021220222122212222022202222220201220212222220212222222202201202220220220202211222212121220222020222212220002202022121212002222122222202222222122212220122220222222222222222202222222201202212222221222222212102200122211221100202220222202221221222111222222222110212022010222112222221122220222212112202222120202212122202222222210220211200010202222221022222222002222122212220002202200222222021222212220222212220120222022111222212222221221211222202122222220120200102222212222222222220220222112222222221122222222102211202201222222212200222202022220202212222202222121212122102222210222021020210222212012222220222212022122212222022211221210121101211222220002222202202210101202221111201202222222022222202122222210220210202122000212202222121120201222212102202221122201222122212222122201220220111022221222220022222200222201000221221211221211222202120220202110222222222200222222122202011222222021221222202102222020222221002022212222122221221210120120221222220202222212202201100222220120211222222202120221202112222212221100222022201202001222122222212222212112012121120202012222202222222220222212020102220222221222222201122210112220220122201210222202221222222222222221221220222222102222112222120120200222212220002120221221112222202222222212221222100100211222221012222210102202221222200201222210222212021220222011222221220012202122010222102222020120020222212220022222121201022222222222022222221220202012212222220002222222022200000221211111211002222212020220202011222211222011202122111202121122020220212222222211222021120222212122202222222221221201121122201222220222222200222222122221202102202002222222122222212000222220220101202222202222010222021222010222222012122122021202202222202222020212222222011110211222221012222222012210122201201112202011222202120222222201222202220111222022202212021122221122122222222210222221120210202022222222021200221211100021221222222112222210212200022221211100211221222222220221222001222201221211212022110212110022120222100222212210002221022221022122212212122222220202002011222222222112222222012222011210221122202021222202021220212001222221221120222022100202200222120202222222212020002021021221122122222222010202222202100110210222220002222211212202201210221011221120222222120221202122222221222101202022200202011122121001002222212211202120121222202122212202202222221221200011212222222102222211212202202222220202201012222202020221212021222201221210212222000202100222020211220222212120112022221221222222212212102200220222121022212222220012222211002211210200210101202002222222021222212221222200220210202222220202022022220220012222212101222020022202112122212212222212221211221100201222221112222212212212202202220000212121222212122220222020202201222122202022222202011022120120101222212002202120120211112022222012201000221212000002200222220112222211212212121220212120220012222222221220212220202222222001222122012202110122022212220222222110112221211222222022202212112002222220012101202202222212222200002212020202202110220010222212020220222100212200221221202022021202112022021012001222222122102220102200002122222112211000222221210210202212222112220210022210111200211011211000222222220220202220212200222021202222001212021122221122110222222220112220221222112122202022102120220220020220201222221202220210122220121212222100212202222212121222222002212201221221222202121202120022220022120222212011202122102221201222212002012011220201211220212202212112221200122201222010222001211102222222121222222010212221221121222222021212212222200201012222202201202222021222012022212222222001220201022102200222210002121200212201111001210001200100222202120221202111212210220101212202120202122222212201212222222200122020211222020222222112201011220211200111120212211022221210222221202010200020221120222202221220222022202222221020202102122202011122002001212212202221202121010220212122212012222000221211012112012212200022122200122220110112210121220221222222120221222222222222221222212222010210210222102011102202212101002121102221021022222022002211221211002100011212221022120200102202021220200110210101222212121222002110212222221011202202011210112122201012210202212020002222120212202222202012020012221211021001221222201202222202112221211200202020210002222102022221022222212211220200222102221210200122102021220212202001022022122210011022222112111020220202102211021202211202022211212201221211220112211100222102220220222021212221221112212202222201021122220102120222222220002022000200202221222122012220221221120211022212210112022200002211200210201020202010222002221221202122212212222202202112102201112122020100211222222210002220122211222121222002201200221011010021001202200212222201212201011222220211212001222112220220202112202212220010202222221201202122222211211222212212202121001202001220202002012022220202110020210202202102121211022222111201211210202120222102120222222222212210220001222012101212001122121022021222212020022222000211201222222212102220220000001002101202212222020202121212200111210012222100222012121220112020212222222021222222010211010022212112012202220011122222012210012221212102121222221220201021222222201022020211202210102201200002200202222022121220202021202221220021222122010202102222121110221212210221202120021221102220202022000000211120211010120222001222220220210212200110221112202121202202121222002022212201022010212102002211111222220210111222200002002122101220010222212222221121221201210202200202110012022200222212100000220021220022222212221221012212212210222002202222202211101022101011212202211021202222100222211020212022110210201010120111220222120022120212221212022001201110221120202202021220112101212212121000212122200212020122112200211212222121022220101210012020202202020020211100012000111212121012022200102222210022211100212111212222220222002022202201022221202212010220222122201101212222212000102021102221102120202012201221212221101201120202221222120201202200011122222002202110202102122221102222222210210012222112010220001122110221010222222021112122121201221022202002021001212221200200012222221202122221021220121022222110222112212100222220012202222211212101222112011221102222212220201222222101122020002201020211212222102210212012210220000222221222120210211202120221201012211101222221120222202111222120201020222002011201020022221201020220220102102220020210221020212102010101211201122211022012121010221212022221200212222221212012202122221222002210202211022120222212002210110022020220002221201021010022012202212010202102100010212221100101120222112011222222100221121122212101211120222101122221012212222022200200210112010210212222201202020212221211211021222200212022212002212021211011011211210112111200122200000202011022212010011122100010012012220222110001111011112011022021210200011211102000112111221211021112010120000000020002111020210202122011220200200111101002021211022220210011
\ No newline at end of file

A cmd/day8/main.go => cmd/day8/main.go +106 -0
@@ 0,0 1,106 @@
package main

import (
	"bufio"
	"fmt"
	"io"
	"math"
	"os"
	"strconv"
	"strings"
)

func loadImageData(filename string) string {
	file, err := os.Open(filename)
	if err != nil {
		panic(fmt.Sprintf("Error encountered opening the specified file ('%s'). Err: %v", filename, err))
	}

	reader := bufio.NewReader(file)
	line, err := reader.ReadString('\n')
	if err != io.EOF {
		panic("File seems malformed?")
	}

	line = strings.Trim(line, " \n\t")

	return line
}

const (
	imageWidth      = 25
	imageHeight     = 6
	testImageWidth  = 3
	testImageHeight = 2
)

type Layer [imageHeight][imageWidth]int

func buildImageLayers(imageData string) []Layer {
	layers := []Layer{}

	imageDataIdx := 0
	for imageDataIdx < len(imageData) {

		var layer = Layer{}

		for ii := 0; ii < len(layer); ii++ {
			for jj := 0; jj < len(layer[jj]); jj++ {
				layer[ii][jj], _ = strconv.Atoi(imageData[imageDataIdx : imageDataIdx+1])
				imageDataIdx++
			}
		}
		layers = append(layers, layer)
	}

	return layers
}

func countSpecifiedValueInLayer(layer Layer, searchValue int) int {
	count := 0
	for ii := 0; ii < len(layer); ii++ {
		for jj := 0; jj < len(layer[ii]); jj++ {
			if layer[ii][jj] == searchValue {
				count++
			}
		}
	}

	return count
}

func findFewestZerosLayer(layers []Layer) Layer {
	var lowestLayer Layer
	lowestZeros := math.MaxInt32

	for _, l := range layers {
		zeros := countSpecifiedValueInLayer(l, 0)

		if zeros < lowestZeros {
			lowestZeros = zeros
			lowestLayer = l
		}
	}

	return lowestLayer
}

// count of 1's multiplied by count of 2's in a given layer
func findImageChecksum(layer Layer) int {
	ones := countSpecifiedValueInLayer(layer, 1)
	fmt.Printf("Count ones: %d\n", ones)
	twos := countSpecifiedValueInLayer(layer, 2)
	fmt.Printf("Count twos: %d\n", twos)
	return ones * twos
}

func main() {
	imageData := loadImageData(os.Args[1])
	println("imageData: ", imageData)
	layers := buildImageLayers(imageData)
	fmt.Printf("layers: %v\n", layers)
	lowestZeroLayer := findFewestZerosLayer(layers)

	fmt.Printf("lowestZeroLayer: %v\n", lowestZeroLayer)
	fmt.Printf("[Part 1] Answer: %v\n", findImageChecksum(lowestZeroLayer))
}

A cmd/day8/simple_image_data.txt => cmd/day8/simple_image_data.txt +1 -0
@@ 0,0 1,1 @@
123456789012
\ No newline at end of file