Finish day04, part 2

This commit is contained in:
ktkk 2025-12-04 10:30:10 +00:00
parent 268b709c07
commit fe3b71908e

View file

@ -3,44 +3,75 @@ const std = @import("std");
pub const title = "Day 04: Printing Department"; pub const title = "Day 04: Printing Department";
pub fn run(_: std.mem.Allocator) !void { pub fn run(_: std.mem.Allocator) !void {
const input = @embedFile("./input/day04.txt"); const initial_input = @embedFile("./input/day04.txt");
var lines = std.mem.tokenizeScalar(u8, input, '\n'); //const initial_input =
// \\..@@.@@@@.
// \\@@@.@.@.@@
// \\@@@@@.@.@@
// \\@.@@@@..@.
// \\@@.@@@@.@@
// \\.@@@@@@@.@
// \\.@.@.@.@@@
// \\@.@@@.@@@@
// \\.@@@@@@@@.
// \\@.@.@@@.@.
// ;
const input: []u8 = @constCast(initial_input);
var accumulator: u32 = 0; var accumulator: u32 = 0;
var previous_line: ?[]const u8 = null; while (true) {
while (lines.next()) |line| { std.debug.print("{s}\n", .{input});
const next_line = lines.peek();
if (previous_line) |p| std.debug.assert(line.len == p.len); var rolls_removed: u32 = 0;
if (next_line) |n| std.debug.assert(line.len == n.len);
for (line, 0..) |c, i| { var lines = std.mem.tokenizeScalar(u8, input, '\n');
if (c != '@') continue;
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 (previous_line) |p| std.debug.assert(line.len == p.len);
if (i > 0 and p[i - 1] == '@') rolls += 1; if (next_line) |n| std.debug.assert(line.len == n.len);
if (p[i] == '@') rolls += 1;
if (i < p.len - 1 and p[i + 1] == '@') rolls += 1; 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; previous_line = line;
if (i < line.len - 1 and line[i + 1] == '@') rolls += 1; line_index += 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; std.debug.print("removed {d} rolls\n", .{rolls_removed});
if (rolls_removed > 0) {
accumulator += rolls_removed;
} else {
break;
}
} }
var buffer: [8]u8 = undefined; var buffer: [8]u8 = undefined;