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); }