git-subtree-dir: 2019 git-subtree-mainline:f1be11fca8
git-subtree-split:fc21396bc8
105 lines
2.3 KiB
Zig
105 lines
2.3 KiB
Zig
const std = @import("std");
|
|
|
|
const depth = 100;
|
|
const width = 25;
|
|
const height = 6;
|
|
|
|
const Layer = [height][width]Colour;
|
|
const Image = [depth]Layer;
|
|
const Colour = enum(u8) {
|
|
Black = 0,
|
|
White = 1,
|
|
Trans = 2,
|
|
};
|
|
|
|
fn printLayer(l: Layer) void {
|
|
for (l) |row| {
|
|
for (row) |byte| {
|
|
switch (byte) {
|
|
.Black => {
|
|
std.debug.warn(" ");
|
|
},
|
|
.White => {
|
|
std.debug.warn("*");
|
|
},
|
|
else => {
|
|
std.debug.warn(" ");
|
|
},
|
|
}
|
|
}
|
|
std.debug.warn("\n");
|
|
}
|
|
std.debug.warn("\n");
|
|
}
|
|
|
|
fn printImage(image: Image) void {
|
|
var meta: Layer = undefined;
|
|
for (meta) |row, y| {
|
|
for (row) |_, x| {
|
|
meta[y][x] = .Trans;
|
|
}
|
|
}
|
|
|
|
for (meta) |*row, y| {
|
|
for (row) |*b, x| {
|
|
var z: usize = 0;
|
|
while (b.* == .Trans) : (z += 1) {
|
|
if (image[z][y][x] != .Trans) {
|
|
b.* = image[z][y][x];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
printLayer(meta);
|
|
}
|
|
|
|
pub fn main() anyerror!void {
|
|
var img: Image = undefined;
|
|
var zeroCounts = [_]usize{0} ** depth;
|
|
|
|
const file = std.io.getStdIn();
|
|
const stream = &file.inStream().stream;
|
|
|
|
for (img) |*layer, z| {
|
|
for (layer) |*row| {
|
|
for (row) |*pixel| {
|
|
var b = try stream.readByte();
|
|
if (b == '0') zeroCounts[z] += 1;
|
|
pixel.* = @intToEnum(Colour, b - '0');
|
|
}
|
|
}
|
|
}
|
|
|
|
// Now count how many zeroes are in each layer, picking out the smallest
|
|
var minCount: usize = width * height;
|
|
var minZ: usize = 0;
|
|
|
|
for (zeroCounts) |count, i| {
|
|
if (count < minCount) {
|
|
minCount = count;
|
|
minZ = i;
|
|
}
|
|
}
|
|
|
|
var num1s: usize = 0;
|
|
var num2s: usize = 0;
|
|
for (img[minZ]) |row| {
|
|
for (row) |b| {
|
|
switch (b) {
|
|
.White => {
|
|
num1s += 1;
|
|
},
|
|
.Trans => {
|
|
num2s += 1;
|
|
},
|
|
else => {},
|
|
}
|
|
}
|
|
}
|
|
|
|
std.debug.warn("Day 8, Part 1: {} with {} zeroes, {} 1s, {} 2s. Result: {}\n\n", minZ, minCount, num1s, num2s, num1s * num2s);
|
|
|
|
printImage(img);
|
|
}
|