diff --git a/src/days/day04.zig b/src/days/day04.zig index 76b2de3..261c31e 100644 --- a/src/days/day04.zig +++ b/src/days/day04.zig @@ -1,46 +1,77 @@ const std = @import("std"); -pub const title = "Day 04"; +pub const title = "Day 04: Printing Department"; pub fn run(_: std.mem.Allocator) !void { - const input = @embedFile("./input/day04.txt"); - var lines = std.mem.tokenizeScalar(u8, input, '\n'); + const initial_input = @embedFile("./input/day04.txt"); + //const initial_input = + // \\..@@.@@@@. + // \\@@@.@.@.@@ + // \\@@@@@.@.@@ + // \\@.@@@@..@. + // \\@@.@@@@.@@ + // \\.@@@@@@@.@ + // \\.@.@.@.@@@ + // \\@.@@@.@@@@ + // \\.@@@@@@@@. + // \\@.@.@@@.@. + // ; + + const input: []u8 = @constCast(initial_input); var accumulator: u32 = 0; - var previous_line: ?[]const u8 = null; - while (lines.next()) |line| { - const next_line = lines.peek(); + while (true) { + std.debug.print("{s}\n", .{input}); - if (previous_line) |p| std.debug.assert(line.len == p.len); - if (next_line) |n| std.debug.assert(line.len == n.len); + var rolls_removed: u32 = 0; - for (line, 0..) |c, i| { - if (c != '@') continue; + var lines = std.mem.tokenizeScalar(u8, input, '\n'); - var rolls: u8 = 0; + var previous_line: ?[]const u8 = null; + var line_index: usize = 0; + while (lines.next()) |line| { + const next_line = lines.peek(); - if (previous_line) |p| { - if (i > 0 and p[i - 1] == '@') rolls += 1; - if (p[i] == '@') rolls += 1; - if (i < p.len - 1 and p[i + 1] == '@') rolls += 1; + if (previous_line) |p| std.debug.assert(line.len == p.len); + if (next_line) |n| std.debug.assert(line.len == n.len); + + for (line, 0..) |c, i| { + if (c != '@') continue; + + var rolls: u8 = 0; + + if (previous_line) |p| { + if (i > 0 and p[i - 1] == '@') rolls += 1; + if (p[i] == '@') rolls += 1; + if (i < p.len - 1 and p[i + 1] == '@') rolls += 1; + } + + if (i > 0 and line[i - 1] == '@') rolls += 1; + if (i < line.len - 1 and line[i + 1] == '@') rolls += 1; + + if (next_line) |n| { + if (i > 0 and n[i - 1] == '@') rolls += 1; + if (n[i] == '@') rolls += 1; + if (i < n.len - 1 and n[i + 1] == '@') rolls += 1; + } + + if (rolls < 4) { + input[(line_index * (line.len + 1)) + i] = 'x'; + rolls_removed += 1; + } } - if (i > 0 and line[i - 1] == '@') rolls += 1; - if (i < line.len - 1 and line[i + 1] == '@') rolls += 1; - - if (next_line) |n| { - if (i > 0 and n[i - 1] == '@') rolls += 1; - if (n[i] == '@') rolls += 1; - if (i < n.len - 1 and n[i + 1] == '@') rolls += 1; - } - - if (rolls < 4) { - accumulator += 1; - } + previous_line = line; + line_index += 1; } - previous_line = line; + std.debug.print("removed {d} rolls\n", .{rolls_removed}); + if (rolls_removed > 0) { + accumulator += rolls_removed; + } else { + break; + } } var buffer: [8]u8 = undefined;