diff --git a/AdventOfCode2023/src/day11/day11.zig b/AdventOfCode2023/src/day11/day11.zig new file mode 100644 index 0000000..c2f30be --- /dev/null +++ b/AdventOfCode2023/src/day11/day11.zig @@ -0,0 +1,150 @@ +const std = @import("std"); +const print = std.debug.print; + +const GALAXY = 1; +const SPACE = 0; + +fn min(num1: u256, num2: u256) usize { + if (num1 > num2) { + return @truncate(num2); + } + return @truncate(num1); +} + +fn max(num1: u256, num2: u256) usize { + if (num1 <= num2) { + return @truncate(num2); + } + return @truncate(num1); +} + +pub fn solve(input: [][]const u8) !void { + var allocator = std.heap.page_allocator; + + var grid = try allocator.alloc(u256, input.len); + var index: usize = 0; + + for (input) |line| { + var line1: u256 = 0; + for (line) |_c| { + var c: u8 = 0; + if (_c == '.') { + c = SPACE; + } else { + c = GALAXY; + } + + line1 = (line1 << 1) | @as(u256, c); + } + + grid[index] = line1; + index += 1; + } + + var rows: u256 = 0; + var cols: u256 = 0; + + for (grid) |row| { + if (row == 0) { + rows = (rows << 1) | @as(u256, 1); + continue; + } + rows = rows << 1; + } + + for (0..input[0].len) |i| { + var empty = true; + for (grid) |row| { + var truncated: u8 = @truncate(input[0].len - i - 1); + if (row & @as(u256, @as(u256, 1) << truncated) != 0) { + empty = false; + break; + } + } + + if (empty) { + cols = (cols << 1) | @as(u256, 1); + continue; + } + cols = cols << 1; + } + + var pair: usize = 0; + var part1: usize = 0; + + for (grid, 0..) |row, i| { + var galaxy: u265 = 1; + for (1..256) |k1| { + var comp1 = galaxy & row; + if (comp1 > 0) { + + // + // We found galaxy! + // + + for (i..grid.len) |j| { + var rowAgain = grid[j]; + var galaxy2: u265 = 1; + + for (1..256) |k2| { + var comp2 = galaxy2 & rowAgain; + if (comp2 > 0) { + var found = i != j or k2 > k1; + + if (found) { + pair += 1; + var distY: u256 = 0; + if (k1 > k2) { + distY = k1 - k2; + } else { + distY = k2 - k1; + } + + // print("Galaxy 1 | {},{}\n", .{ k1, i }); + // print("Galaxy 2 | {},{}\n", .{ k2, j }); + + var emptyRows: u256 = 0; + var emptyCols: u256 = 0; + + if (i != j) { + for (i + 1..j) |_shift| { + var shift: u8 = @truncate(_shift); + var u8Length: u8 = @truncate(input.len); + var r = @as(u256, 1) << (u8Length - shift - 1); + + if (r & rows > 0) { + emptyRows += 1; + } + } + } + + if (k1 != k2) { + for (min(k1, k2) + 1..max(k1, k2)) |_shift| { + var shift: u8 = @truncate(_shift); + var u8Length: u8 = @truncate(input[0].len); + var r = @as(u256, 1) << (u8Length - shift - 1); + + if (r & cols > 0) { + emptyCols += 1; + } + } + } + + var dist = distY + (j - i) + emptyRows + emptyCols; + + print("Distance: {}\n", .{dist}); + print("---\n", .{}); + part1 += @truncate(dist); + } + } + galaxy2 = galaxy2 << 1; + } + } + } + galaxy = galaxy << 1; + } + } + + print("Pairs: {}\n", .{pair}); + print("Part 1: {}\n", .{part1}); +} diff --git a/AdventOfCode2023/src/main.zig b/AdventOfCode2023/src/main.zig index 3651c57..d35caf7 100644 --- a/AdventOfCode2023/src/main.zig +++ b/AdventOfCode2023/src/main.zig @@ -7,13 +7,14 @@ const std = @import("std"); // const day6 = @import("./day6/day6.zig"); // const day7 = @import("./day7/day7.zig"); // const day9 = @import("./day9/day9.zig"); -const day10 = @import("./day10/day10.zig"); +// const day10 = @import("./day10/day10.zig"); +const day11 = @import("./day11/day11.zig"); const utils = @import("utils.zig"); pub fn main() !void { const allocator = std.heap.page_allocator; - var input = try utils.getInput("./src/day10/input.txt", allocator); + var input = try utils.getInput("./src/day11/input.txt", allocator); defer allocator.free(input); - try day10.solve(input); + try day11.solve(input); }