const std = @import("std"); const print = std.debug.print; pub fn solve(part: []u8, reader: *std.Io.Reader, allocator: std.mem.Allocator) !void { if (std.mem.eql(u8, part, "1")) { try part1(reader, allocator); } else { try part2(reader, allocator); } } fn part1(reader: *std.Io.Reader, allocator: std.mem.Allocator) !void { var output: usize = 0; var problems = try std.ArrayList(std.ArrayList(usize)).initCapacity(allocator, 0); defer problems.deinit(allocator); while (reader.takeDelimiter('\n')) |line| { if (line == null) { break; } var split = std.mem.splitScalar(u8, line.?, ' '); var n: usize = 0; while(split.next()) |part| { if (part.len > 0){ if (part[0] == '+') { for(problems.items[n].items) |number| { output += number; } problems.items[n].deinit(allocator); } else if (part[0] == '*') { var tmp: usize = 1; for(problems.items[n].items) |number| { tmp *= number; } output += tmp; problems.items[n].deinit(allocator); } else { const number = try std.fmt.parseInt(usize, part, 10); if (n >= problems.items.len) { try problems.append(allocator, try std.ArrayList(usize).initCapacity(allocator, 0)); } try problems.items[n].append(allocator, number); } n += 1; } } } else |_| {} print("{d}\n", .{output}); } fn part2(reader: *std.Io.Reader, allocator: std.mem.Allocator) !void { var output: usize = 0; var problems = try std.ArrayList([]u8).initCapacity(allocator, 0); defer problems.deinit(allocator); while (reader.takeDelimiter('\n')) |line| { if (line == null) { break; } try problems.append(allocator, line.?); } else |_| {} var n: usize = 0; var accum: usize = 1; var operator = problems.items[problems.items.len - 1][0]; while(n < problems.items[0].len) { var number: usize = 0; for (0..problems.items.len - 1) |i| { if (problems.items[i][n] != ' ') { number *= 10; number += problems.items[i][n] - '0'; } } n += 1; if (number == 0) { if (operator == '*') { output += accum; } operator = problems.items[problems.items.len - 1][n]; accum = 1; } else if (operator == '+') { output += number; } else { accum *= number; } } print("{d}\n", .{output}); }