diff --git a/src/day14.zig b/src/day14.zig new file mode 100644 index 0000000..bfbf143 --- /dev/null +++ b/src/day14.zig @@ -0,0 +1,78 @@ +const std = @import("std"); +const util = @import("util.zig"); +const mem = std.mem; + +pub fn main() !void { + const input = @embedFile("data/day14.txt"); + const sln = try solve(util.gpa, input); + std.debug.print("{d}\n", .{sln.a}); + std.debug.print("{d}\n", .{sln.b}); +} + +const Solution = struct { + a: usize, + b: usize, +}; + +fn solve(alloc: mem.Allocator, input: []const u8) !Solution { + const width = mem.indexOfScalar(u8, input, '\n').?; + var height = mem.count(u8, input, &[_]u8{'\n'}); + if (input[input.len - 1] != '\n') height += 1; + + var next_slot = try alloc.alloc(u32, width); + defer alloc.free(next_slot); + @memset(next_slot, 0); + + var weight: usize = 0; + + var it = util.splitLines(input); + var row: u32 = 0; + while (it.next()) |line| { + if (line.len == 0) continue; + for (line, 0..) |char, col| { + switch (char) { + 'O' => { + std.debug.print("rock at {}x{} moves to {}\n", .{ col, row, height - next_slot[col] }); + weight += height - next_slot[col]; + next_slot[col] += 1; + std.debug.print("{any}\n", .{next_slot}); + }, + '#' => { + std.debug.print("cube at {}x{}\n", .{ col, row }); + next_slot[col] = @as(u32, @intCast(row)) + 1; + std.debug.print("{any}\n", .{next_slot}); + }, + else => {}, + } + } + row += 1; + } + + return .{ .a = weight, .b = 0 }; +} + +test "silver" { + const input = + \\O....#.... + \\O.OO#....# + \\.....##... + \\OO.#O....O + \\.O.....O#. + \\O.#..O.#.# + \\..O..#O..O + \\.......O.. + \\#....###.. + \\#OO..#.... + ; + const sln = try solve(std.testing.allocator, input); + try std.testing.expectEqual(@as(usize, 136), sln.a); +} + +test "gold" { + const input = + \\ + ; + _ = input; + // const sln = try solve(std.testing.allocator, input); + // try std.testing.expectEqual(@as(usize, 0), sln.b); +}