Finish day11, part 2
This commit is contained in:
parent
76b70d3c6b
commit
524b451399
1 changed files with 22 additions and 9 deletions
|
|
@ -63,15 +63,29 @@ pub fn run(allocator: std.mem.Allocator) !void {
|
||||||
|
|
||||||
var cache: std.StringHashMap(usize) = .init(allocator);
|
var cache: std.StringHashMap(usize) = .init(allocator);
|
||||||
defer cache.deinit();
|
defer cache.deinit();
|
||||||
|
try cache.ensureTotalCapacity(devices.count());
|
||||||
|
|
||||||
var paths_to_out: usize = 0;
|
const dac_to_fft = try visitOutputs("dac", "fft", devices, &cache);
|
||||||
try visitOutputs("svr", "fft", devices, &cache, &paths_to_out);
|
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 buffer: [8]u8 = undefined;
|
||||||
var stdout_writer = std.fs.File.stdout().writer(&buffer);
|
var stdout_writer = std.fs.File.stdout().writer(&buffer);
|
||||||
const stdout = &stdout_writer.interface;
|
const stdout = &stdout_writer.interface;
|
||||||
|
|
||||||
try stdout.print("{d}\n", .{paths_to_out});
|
try stdout.print("{d}\n", .{result});
|
||||||
|
|
||||||
try stdout.flush();
|
try stdout.flush();
|
||||||
}
|
}
|
||||||
|
|
@ -81,11 +95,9 @@ fn visitOutputs(
|
||||||
end: []const u8,
|
end: []const u8,
|
||||||
devices: std.StringHashMap([][]const u8),
|
devices: std.StringHashMap([][]const u8),
|
||||||
cache: *std.StringHashMap(usize),
|
cache: *std.StringHashMap(usize),
|
||||||
paths_to_end: *usize,
|
) !usize {
|
||||||
) !void {
|
|
||||||
if (cache.get(start)) |result| {
|
if (cache.get(start)) |result| {
|
||||||
paths_to_end.* += result;
|
return result;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var paths: usize = 0;
|
var paths: usize = 0;
|
||||||
|
|
@ -95,13 +107,14 @@ fn visitOutputs(
|
||||||
if (std.mem.eql(u8, output, end)) {
|
if (std.mem.eql(u8, output, end)) {
|
||||||
paths += 1;
|
paths += 1;
|
||||||
} else {
|
} else {
|
||||||
try visitOutputs(output, end, devices, cache, &paths);
|
paths += try visitOutputs(output, end, devices, cache);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try cache.put(start, paths);
|
try cache.put(start, paths);
|
||||||
paths_to_end.* += paths;
|
return paths;
|
||||||
} else {
|
} else {
|
||||||
std.debug.print("device {s} not found\n", .{start});
|
std.debug.print("device {s} not found\n", .{start});
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue