From fc3a53c68dd9e415edfa7e06cc822a9cac7fce1d Mon Sep 17 00:00:00 2001 From: ktkk Date: Sat, 6 Dec 2025 23:11:05 +0000 Subject: [PATCH] Finish day06, part 2 --- src/days/day06.zig | 55 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/src/days/day06.zig b/src/days/day06.zig index d721260..8c63bdd 100644 --- a/src/days/day06.zig +++ b/src/days/day06.zig @@ -18,7 +18,13 @@ pub fn run(allocator: std.mem.Allocator) !void { var operators_s: []const u8 = undefined; + var line_len: usize = 0; while (lines.next()) |line| { + if (line_len != 0) { + std.debug.assert(line_len == line.len); + } + line_len = line.len; + std.debug.print("{s}\n", .{line}); if (lines.peek() == null) { operators_s = line; @@ -40,31 +46,54 @@ pub fn run(allocator: std.mem.Allocator) !void { defer allocator.free(results); @memset(results, 0); - for (numbers.items, 0..) |n, i| { - var numbers_i = std.mem.tokenizeScalar(u8, n, ' '); + var oi: usize = operators.items.len - 1; + var oni: usize = 0; + for (0..line_len) |i| { + const ri = line_len - 1 - i; + + var number: u64 = 0; + var all_spaces = true; + + var numbers_reverse_i = std.mem.reverseIterator(numbers.items); var ni: usize = 0; - while (numbers_i.next()) |number_s| { - defer ni += 1; + while (numbers_reverse_i.next()) |n| { + const c = n[ri]; + if (c == ' ') { + continue; + } else { + defer ni += 1; - std.debug.print("number = {s}\n", .{number_s}); + all_spaces = all_spaces and false; + const digit = try std.fmt.charToDigit(c, 10); + number += digit * std.math.pow(u64, 10, ni); + } + } - const number = try std.fmt.parseUnsigned(u64, number_s, 10); - const operator = operators.items[ni]; + if (all_spaces) { + std.debug.print("all spaces\n", .{}); + oi -= 1; + oni = 0; + } else { + defer oni += 1; - if (i == 0) { - results[ni] = number; + const operator = operators.items[oi]; + std.debug.print("operator {d} = {c}\n", .{oi, operator}); + + std.debug.print("oni = {d}\n", .{oni}); + + if (oni == 0) { + results[oi] = number; } else { if (operator == '+') { - results[ni] += number; + results[oi] += number; } else if (operator == '*') { - results[ni] *= number; + results[oi] *= number; } else { - std.debug.print("operator = {c}\n", .{operator}); unreachable; } } - std.debug.print("result = {d}\n", .{results[ni]}); + std.debug.print("result = {d}\n", .{results[oi]}); } }