diff --git a/src/days/day11.zig b/src/days/day11.zig index b8084d4..5e7686a 100644 --- a/src/days/day11.zig +++ b/src/days/day11.zig @@ -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; } }