const std = @import("std"); const PATH = "input/day03.txt"; const ROWS = 323; const COLS = 31; const Map = std.StaticBitSet(ROWS * COLS); pub fn first(allocator: ?std.mem.Allocator) anyerror!usize { _ = allocator; const map = parseInput(); const move = [2]usize{ 1, 3 }; var row: usize = 0; var col: usize = 0; var trees: usize = 0; while (row < ROWS) : ({ row += move[0]; col += move[1]; }) { // std.debug.print("{d} {d} {}\n", .{ row, col % COLS, map.isSet(row * COLS + col % COLS) }); if (map.isSet(row * COLS + col % COLS)) trees += 1; } return trees; } pub fn second(allocator: ?std.mem.Allocator) anyerror!usize { _ = allocator; const map = parseInput(); const moves = [_][2]usize{ .{ 1, 3 }, .{ 1, 1 }, .{ 1, 5 }, .{ 1, 7 }, .{ 2, 1 }, }; var ret: usize = 1; for (moves) |move| { var row: usize = 0; var col: usize = 0; var trees: usize = 0; while (row < ROWS) : ({ row += move[0]; col += move[1]; }) { // std.debug.print("{d} {d} {}\n", .{ row, col % COLS, map.isSet(row * COLS + col % COLS) }); if (map.isSet(row * COLS + col % COLS)) trees += 1; } ret *= trees; } return ret; } fn parseInput() Map { const file = @embedFile(PATH); var lines = std.mem.tokenize(u8, file, "\n"); var map = Map.initEmpty(); var row: usize = 0; while (lines.next()) |line| : (row += 1) { for (line) |ch, col| { // std.debug.print("{d} {d} {s}\n", .{row, col, line}); if (ch == '#') map.set(row * COLS + col); } } return map; } test "day03a" { try std.testing.expectEqual(@as(usize, 148), try first(std.testing.allocator)); } test "day03b" { try std.testing.expectEqual(@as(usize, 727923200), try second(std.testing.allocator)); }