From a9ac204eb9ab45d264e2b56f34230de49c051ef8 Mon Sep 17 00:00:00 2001 From: John Costa Date: Fri, 8 Dec 2023 21:58:33 +0000 Subject: [PATCH] Day 8 --- AdventOfCode2023/src/day8/day8.zig | 111 +++++++++++++++++++++++++++++ AdventOfCode2023/src/main.zig | 7 +- 2 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 AdventOfCode2023/src/day8/day8.zig diff --git a/AdventOfCode2023/src/day8/day8.zig b/AdventOfCode2023/src/day8/day8.zig new file mode 100644 index 0000000..6b064a9 --- /dev/null +++ b/AdventOfCode2023/src/day8/day8.zig @@ -0,0 +1,111 @@ +const std = @import("std"); +const print = std.debug.print; + +fn gcd(a: usize, b: usize) usize { + if (b == 0) { + return a; + } + return gcd(b, a % b); +} + +fn lcm(a: usize, b: usize) usize { + return (a / gcd(a, b)) * b; +} + +const TreeishNode = struct { + label: []const u8, + left: ?(*TreeishNode), + right: ?(*TreeishNode), +}; + +pub fn solve(input: [][]const u8) !void { + var allocator = std.heap.page_allocator; + + var instructions = input[0]; + + var map = input[1..]; + + var nodeMap = std.StringHashMap(*TreeishNode).init(allocator); + defer nodeMap.deinit(); + + for (map) |line| { + var label = line[0..3]; + + var node = try allocator.create(TreeishNode); + node.label = label; + node.left = undefined; + node.right = undefined; + try nodeMap.put(label, node); + } + + for (map) |line| { + var label = line[0..3]; + var left = line[7..10]; + var right = line[12..15]; + + var labelNode = nodeMap.get(label).?; + var leftNode = nodeMap.get(left).?; + var rightNode = nodeMap.get(right).?; + + labelNode.*.left = leftNode; + labelNode.*.right = rightNode; + } + + // var starting: []const u8 = "AAA"; + // var part1: usize = 0; + // + // while (!std.mem.eql(u8, starting, "ZZZ")) { + // for (instructions) |letter| { + // part1 += 1; + // var current = nodeMap.get(starting).?; + // if (letter == 'R') { + // starting = current.*.right.?.label; + // } else { + // starting = current.*.left.?.label; + // } + // } + // } + + var startingPaths = std.ArrayList([]const u8).init(allocator); + var pathLength = std.ArrayList(usize).init(allocator); + + defer startingPaths.deinit(); + defer pathLength.deinit(); + + var iter = nodeMap.keyIterator(); + while (iter.next()) |key| { + if (key.*[2] == 'A') { + try startingPaths.append(key.*); + } + } + + for (startingPaths.items) |path| { + var s: []const u8 = path; + var length: usize = 0; + + while (s[2] != 'Z') { + for (instructions) |letter| { + length += 1; + var current = nodeMap.get(s).?; + if (letter == 'R') { + s = current.*.right.?.label; + } else { + s = current.*.left.?.label; + } + } + } + + try pathLength.append(length); + } + + var lengths = try pathLength.toOwnedSlice(); + print("{any}\n", .{lengths}); + + var part2 = lcm(lengths[0], lengths[1]); + for (2..lengths.len) |n| { + part2 = lcm(part2, lengths[n]); + } + + // print("Part 1: {}\n", .{part1}); + print("Part 2: {}\n", .{part2}); +} diff --git a/AdventOfCode2023/src/main.zig b/AdventOfCode2023/src/main.zig index 62a9d6b..52a56d4 100644 --- a/AdventOfCode2023/src/main.zig +++ b/AdventOfCode2023/src/main.zig @@ -5,13 +5,14 @@ const std = @import("std"); // const day4 = @import("./day4/day4.zig"); // const day5 = @import("./day5/day5.zig"); // const day6 = @import("./day6/day6.zig"); -const day7 = @import("./day7/day7.zig"); +// const day7 = @import("./day7/day7.zig"); +const day8 = @import("./day8/day8.zig"); const utils = @import("utils.zig"); pub fn main() !void { const allocator = std.heap.page_allocator; - var input = try utils.getInput("./src/day7/input.txt", allocator); + var input = try utils.getInput("./src/day8/input.txt", allocator); defer allocator.free(input); - try day7.solve(input); + try day8.solve(input); }