const std = @import("std"); fn maxIndex(comptime T: type, a: []T) ?usize { if (a.len == 0) { return null; } var max: T = a[0]; var maxi: usize = 0; for (1..a.len) |i| { if (a[i] > max) { max = a[i]; maxi = i; } } return maxi; } fn getMaxJoltage(line: []u8, n: usize) u64 { // line contains ascii with a trailing newline // - to convert ascii digits to ints we need to subtract '0' // - we need to ignore the last byte var result: u64 = 0; var offset: usize = 0; for (0..n) |i| { const maxIx = maxIndex(u8, line[offset .. line.len - (n - i)]).?; result = result * 10 + line[offset + maxIx] - '0'; offset += maxIx + 1; } return result; } pub fn main() !void { const path: [:0]const u8 = std.mem.span(std.os.argv[1]); var file = try std.fs.cwd().openFile(path, .{}); defer file.close(); var buffer: [128]u8 = undefined; var reader = file.reader(&buffer); var part1: u64 = 0; var part2: u64 = 0; while (reader.interface.takeDelimiterInclusive('\n')) |line| { part1 += getMaxJoltage(line, 2); part2 += getMaxJoltage(line, 12); } else |err| switch (err) { error.EndOfStream => {}, else => |e| return e, } std.debug.print("part1: {}\n", .{part1}); std.debug.print("part2: {}\n", .{part2}); }