1
Fork 0
mirror of https://github.com/thegeneralist01/aoc synced 2026-03-07 10:59:54 +01:00
aoc/day3/day3_part1.zig
2024-12-03 16:49:17 +01:00

91 lines
2.6 KiB
Zig

const std = @import("std");
fn is_digit(c: u8) bool {
return switch (c) {
'0'...'9' => true,
else => false,
};
}
fn parse_mul(s: []const u8) !i32 {
if (s.len < 8) return -1;
if (s[0] != 'm') return -1;
if (s[1] != 'u') return -1;
if (s[2] != 'l') return -1;
if (s[3] != '(') return -1;
var int1: u32 = 0;
var int2: u32 = 0;
var comma_ind: usize = 0;
for (s[4..], 0..) |c, i| {
if (c == ',') {
comma_ind = 5+i;
break;
} else if (!is_digit(c)) {
std.debug.print("{c}\n", .{c});
return -1;
}
int1 = int1 * 10 + try std.fmt.parseInt(u16, &[_]u8{c}, 10);
}
for (s[comma_ind..]) |c| {
if (c == ')') {
break;
}
int2 = int2 * 10 + try std.fmt.parseInt(u16, &[_]u8{c}, 10);
}
return @intCast(int1 * int2);
}
pub fn main() !void {
const file = try std.fs.cwd().openFile("input", .{});
defer file.close();
const file_reader = file.reader();
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const ally = gpa.allocator();
defer _ = gpa.deinit();
var input_buf = std.ArrayListUnmanaged(u8){};
defer input_buf.deinit(ally);
var sum: u32 = 0;
var match_str = std.ArrayListUnmanaged(u8){};
try match_str.ensureTotalCapacity(ally, 15);
defer match_str.deinit(ally);
var matching_mul = false;
var matching_ind: u32 = 0;
while (true) {
defer input_buf.clearRetainingCapacity();
file_reader.streamUntilDelimiter(input_buf.writer(ally), '\n', null) catch |err| switch (err) {
error.EndOfStream => break,
else => break,
};
for (input_buf.items, 0..) |c, i| {
if (matching_mul) {
if (c != 'm' and c != 'u' and c != 'l' and c != '(' and c != ')' and c != ',' and !is_digit(c)) {
matching_mul = false;
match_str.clearRetainingCapacity();
continue;
}
try match_str.append(ally, c);
if (c == ')') {
const mul_parsed = parse_mul(match_str.items) catch |err| {
return err;
};
sum += if (mul_parsed < 0) 0 else @intCast(mul_parsed);
matching_mul = false;
match_str.clearRetainingCapacity();
}
} else if (c == 'm') {
try match_str.append(ally, c);
matching_mul = true;
matching_ind = @intCast(i);
}
}
}
std.debug.print("{}\n", .{sum});
}