const std = @import("std"); const Str = []const u8; const PATH = "input/day05.txt"; const ROWS = 876; const SMALLEST = 99; pub fn first(allocator: ?std.mem.Allocator) anyerror!usize { _ = allocator; const file = @embedFile(PATH); var passes = std.mem.tokenize(u8, file, "\n"); var max: usize = 0; while (passes.next()) |pass| { const row = getRow(pass); const col = getCol(pass[7..]); const id = row * 8 + col; if (id > max) max = id; } return max; } pub fn second(allocator: ?std.mem.Allocator) anyerror!usize { _ = allocator; const file = @embedFile(PATH); var passes = std.mem.tokenize(u8, file, "\n"); var seats = std.StaticBitSet(ROWS).initFull(); while (passes.next()) |pass| { const row = getRow(pass); const col = getCol(pass[7..]); const id = row * 8 + col; seats.unset(id - SMALLEST); } return seats.findFirstSet().? + SMALLEST; } fn getRow(in: Str) usize { var min: usize = 0; var max: usize = 127; for (in) |ch| { switch (ch) { 'F' => max = min + (max - min) / 2, 'B' => min += (max - min) / 2 + 1, else => break, } // std.debug.print("{d} {d}\n", .{ min, max }); } return min; } fn getCol(in: Str) usize { var min: usize = 0; var max: usize = 7; for (in) |ch| { switch (ch) { 'L' => max = min + (max - min) / 2, 'R' => min += (max - min) / 2 + 1, else => unreachable, } // std.debug.print("{d} {d}\n", .{ min, max }); } return min; } test "getRow" { try std.testing.expectEqual(@as(usize, 44), getRow("FBFBBFFRLR")); } test "getCol" { try std.testing.expectEqual(@as(usize, 5), getCol("RLR")); } test "day05a" { try std.testing.expectEqual(@as(usize, 974), try first(std.testing.allocator)); } test "day05b" { try std.testing.expectEqual(@as(usize, 646), try second(std.testing.allocator)); }