Finish day11, part 2

This commit is contained in:
ktkk 2025-12-11 18:40:52 +00:00
parent 76b70d3c6b
commit 524b451399

View file

@ -63,15 +63,29 @@ pub fn run(allocator: std.mem.Allocator) !void {
var cache: std.StringHashMap(usize) = .init(allocator);
defer cache.deinit();
try cache.ensureTotalCapacity(devices.count());
var paths_to_out: usize = 0;
try visitOutputs("svr", "fft", devices, &cache, &paths_to_out);
const dac_to_fft = try visitOutputs("dac", "fft", devices, &cache);
const svr_to_fft = try visitOutputs("svr", "fft", devices, &cache);
cache.clearRetainingCapacity();
const to_fft = if (dac_to_fft == 0) svr_to_fft else dac_to_fft;
const dac_start = if (dac_to_fft == 0) "fft" else "svr";
const end_start = if (dac_to_fft == 0) "dac" else "fft";
const to_dac = try visitOutputs(dac_start, "dac", devices, &cache);
cache.clearRetainingCapacity();
const to_end = try visitOutputs(end_start, "out", devices, &cache);
const result = to_fft * to_dac * to_end;
var buffer: [8]u8 = undefined;
var stdout_writer = std.fs.File.stdout().writer(&buffer);
const stdout = &stdout_writer.interface;
try stdout.print("{d}\n", .{paths_to_out});
try stdout.print("{d}\n", .{result});
try stdout.flush();
}
@ -81,11 +95,9 @@ fn visitOutputs(
end: []const u8,
devices: std.StringHashMap([][]const u8),
cache: *std.StringHashMap(usize),
paths_to_end: *usize,
) !void {
) !usize {
if (cache.get(start)) |result| {
paths_to_end.* += result;
return;
return result;
}
var paths: usize = 0;
@ -95,13 +107,14 @@ fn visitOutputs(
if (std.mem.eql(u8, output, end)) {
paths += 1;
} else {
try visitOutputs(output, end, devices, cache, &paths);
paths += try visitOutputs(output, end, devices, cache);
}
}
try cache.put(start, paths);
paths_to_end.* += paths;
return paths;
} else {
std.debug.print("device {s} not found\n", .{start});
return 0;
}
}