Solved day 4 part 2. Much easier than part 1...

Signed-off-by: jmug <u.g.a.mariano@gmail.com>
This commit is contained in:
Mariano Uvalle 2024-12-04 22:53:40 +00:00
parent a60010f7bc
commit 27d3095fad

54
src/day04-2.zig Normal file
View file

@ -0,0 +1,54 @@
const std = @import("std");
const print = std.debug.print;
const process = std.process;
const fmt = std.fmt;
const files = @import("lib/files.zig");
const args = @import("lib/args.zig");
fn solve(search: *[141][141]u8, size: u8) u32 {
var total: u32 = 0;
for (1..size - 1) |l| {
for (1..size - 1) |c| {
if (search[l][c] != 'A') {
continue;
}
if (((search[l - 1][c - 1] == 'S' and search[l + 1][c + 1] == 'M') or
(search[l - 1][c - 1] == 'M' and search[l + 1][c + 1] == 'S')) and
((search[l + 1][c - 1] == 'S' and search[l - 1][c + 1] == 'M') or
(search[l + 1][c - 1] == 'M' and search[l - 1][c + 1] == 'S')))
{
total += 1;
}
}
}
return total;
}
pub fn main() !void {
var margs = process.args();
defer margs.deinit();
_ = margs.skip();
const input_path = margs.next() orelse {
print("First argument should be the input file\n", .{});
return args.ArgError.MissingArguments;
};
// Only read one dimension, the input is a square matrix.
const input_size_str = margs.next() orelse {
print("Second argument should be the input size\n", .{});
return args.ArgError.MissingArguments;
};
const input_size = try fmt.parseUnsigned(u8, input_size_str, 10);
const input = try files.openForReading(input_path);
// 140 is the size of the max input.
// NOTE: We need one more character than the max line length
// Because we're reading directly to the buffer and not using the
// result.
var word_search: [141][141]u8 = undefined;
for (0..input_size) |l| {
_ = files.readLine(input, &word_search[l]) catch {};
}
const total = solve(&word_search, input_size);
print("Total X-MAS: {d}\n", .{total});
}