Finish day06, part 2

This commit is contained in:
ktkk 2025-12-06 23:11:05 +00:00
parent 5a0c313961
commit fc3a53c68d

View file

@ -18,7 +18,13 @@ pub fn run(allocator: std.mem.Allocator) !void {
var operators_s: []const u8 = undefined; var operators_s: []const u8 = undefined;
var line_len: usize = 0;
while (lines.next()) |line| { 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}); std.debug.print("{s}\n", .{line});
if (lines.peek() == null) { if (lines.peek() == null) {
operators_s = line; operators_s = line;
@ -40,31 +46,54 @@ pub fn run(allocator: std.mem.Allocator) !void {
defer allocator.free(results); defer allocator.free(results);
@memset(results, 0); @memset(results, 0);
for (numbers.items, 0..) |n, i| { var oi: usize = operators.items.len - 1;
var numbers_i = std.mem.tokenizeScalar(u8, n, ' '); 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; var ni: usize = 0;
while (numbers_i.next()) |number_s| { while (numbers_reverse_i.next()) |n| {
defer ni += 1; 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); if (all_spaces) {
const operator = operators.items[ni]; std.debug.print("all spaces\n", .{});
oi -= 1;
oni = 0;
} else {
defer oni += 1;
if (i == 0) { const operator = operators.items[oi];
results[ni] = number; std.debug.print("operator {d} = {c}\n", .{oi, operator});
std.debug.print("oni = {d}\n", .{oni});
if (oni == 0) {
results[oi] = number;
} else { } else {
if (operator == '+') { if (operator == '+') {
results[ni] += number; results[oi] += number;
} else if (operator == '*') { } else if (operator == '*') {
results[ni] *= number; results[oi] *= number;
} else { } else {
std.debug.print("operator = {c}\n", .{operator});
unreachable; unreachable;
} }
} }
std.debug.print("result = {d}\n", .{results[ni]}); std.debug.print("result = {d}\n", .{results[oi]});
} }
} }