/
day08.go
108 lines (97 loc) · 2.07 KB
/
day08.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package day08
import (
"image"
"image/color"
"image/png"
"io/ioutil"
"log"
"math"
"os"
"strconv"
)
type layer struct {
pixels []int
}
func (l layer) png(file string, width int, height int) {
img := image.NewNRGBA(image.Rect(0, 0, width, height))
f, err := os.Create(file)
defer f.Close()
if err != nil {
log.Fatal(err)
}
for y := 0; y < height; y++ {
for x := 0; x < width; x++ {
idx := y * width + x
if l.pixels[idx] == 0 {
img.Set(x, y, color.Black)
} else {
img.Set(x, y, color.White)
}
}
}
if err := png.Encode(f, img); err != nil {
log.Fatal(err)
}
}
type eimage struct {
width int
height int
layers []layer
}
func image_create(width int, height int, input []int) eimage {
layer_pixels := width*height
num_layers := len(input)/layer_pixels
image := eimage{
width: width,
height: height,
layers: make([]layer, 0, num_layers),
}
for i := 0; i < num_layers; i++ {
layer := layer{pixels: make([]int, layer_pixels)}
start := i*layer_pixels
end := start+layer_pixels
copy(layer.pixels, input[start:end])
image.layers = append(image.layers, layer)
}
return image
}
func (i eimage) render() layer {
layer_pixels := i.width*i.height
output := layer{make([]int, layer_pixels)}
written := map[int]bool{}
for _, layer := range i.layers {
for i := 0; i < layer_pixels; i++ {
if _, has_val := written[i]; !has_val && layer.pixels[i] != 2 {
written[i] = true
output.pixels[i] = layer.pixels[i]
}
}
}
return output
}
func pixels_load(file string) []int {
buf, _ := ioutil.ReadFile(file)
str := string(buf)
pixels := make([]int, 0, len(str))
for i := 0; i < len(str); i++ {
pixel, _ := strconv.Atoi(str[i:i+1])
pixels = append(pixels, pixel)
}
return pixels
}
func Day08_part1_solve(width int, height int, input []int) int {
image := image_create(width, height, input)
best := math.MaxInt32
var ans int
for _, i := range image.layers {
counts := [3]int{0, 0, 0}
for _, j := range i.pixels {
counts[j]++
}
if counts[0] < best {
best = counts[0]
ans = counts[1]*counts[2]
}
}
return ans
}