stayerc

Advent Of Code 2025 Day 4

Dec 4th, 2025
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.73 KB | Source Code | 0 0
  1. const std = @import("std");
  2.  
  3. const Coords = struct { x: usize, y: usize };
  4. const Dir = struct { dx: i32, dy: i32 };
  5.  
  6. fn checkNeighbours(grid: [][]u8, x: usize, y: usize) bool {
  7. const height = grid.len;
  8.  
  9. const dirs: [8]Dir = .{
  10. Dir{ .dx = -1, .dy = -1 }, Dir{ .dx = 0, .dy = -1 }, Dir{ .dx = 1, .dy = -1 },
  11. Dir{ .dx = -1, .dy = 0 }, Dir{ .dx = 1, .dy = 0 }, Dir{ .dx = -1, .dy = 1 },
  12. Dir{ .dx = 0, .dy = 1 }, Dir{ .dx = 1, .dy = 1 },
  13. };
  14.  
  15. var count: u8 = 0;
  16.  
  17. for (dirs) |d| {
  18. const nx_i = @as(i32, @intCast(x)) + d.dx;
  19. const ny_i = @as(i32, @intCast(y)) + d.dy;
  20.  
  21. if (nx_i < 0 or ny_i < 0) continue;
  22. const nx: usize = @intCast(nx_i);
  23. const ny: usize = @intCast(ny_i);
  24.  
  25. if (ny >= height) continue;
  26. if (nx >= grid[ny].len) continue;
  27.  
  28. if (grid[ny][nx] == 1) {
  29. count += 1;
  30. if (count > 3) return false;
  31. }
  32. }
  33.  
  34. return true;
  35. }
  36.  
  37. fn dayFourBothParts(stdout: *std.Io.Writer, allocator: std.mem.Allocator) !void {
  38. const file = try std.fs.cwd().openFile("data.txt", .{ .mode = .read_only });
  39. defer file.close();
  40.  
  41. var file_buffer: [4096]u8 = undefined;
  42. var file_reader = file.reader(&file_buffer);
  43. const reader = &file_reader.interface;
  44.  
  45. var placement_list: std.ArrayList([]u8) = .empty;
  46. defer placement_list.deinit(allocator);
  47.  
  48. while (reader.takeDelimiterExclusive('\n')) |line| {
  49. reader.toss(1);
  50. var list: std.ArrayList(u8) = .empty;
  51. for (line) |char| {
  52. if (char == '@') {
  53. try list.append(allocator, 1);
  54. } else {
  55. try list.append(allocator, 0);
  56. }
  57. }
  58. const slice = try list.toOwnedSlice(allocator);
  59.  
  60. try placement_list.append(allocator, slice);
  61. } else |err| switch (err) {
  62. error.EndOfStream => {},
  63. else => return err,
  64. }
  65.  
  66. var coordinates_list: std.ArrayList(Coords) = .empty;
  67. defer coordinates_list.deinit(allocator);
  68.  
  69. const placement = try placement_list.toOwnedSlice(allocator);
  70.  
  71. var movable_part_one: u16 = 0;
  72. var movable_part_two: u32 = 0;
  73. var y: usize = 0;
  74. while (y < placement.len) : (y += 1) {
  75. var x: usize = 0;
  76. while (x < placement[y].len) : (x += 1) {
  77. if (placement[y][x] == 1) {
  78. if (checkNeighbours(placement, x, y)) {
  79. movable_part_one += 1;
  80. movable_part_two += 1;
  81. const coords = Coords{ .x = x, .y = y };
  82. try coordinates_list.append(allocator, coords);
  83. }
  84. }
  85. }
  86. }
  87.  
  88. // Moving the rolls
  89. for (coordinates_list.items) |coords| {
  90. const cx = coords.x;
  91. const cy = coords.y;
  92. placement[cy][cx] = 0;
  93. }
  94. coordinates_list.clearRetainingCapacity();
  95.  
  96. try stdout.print("Number of movable rolls: {d}\n", .{movable_part_one});
  97. try stdout.flush();
  98. try stdout.print("--" ** 20 ++ "\n", .{});
  99. const day: u8 = 4;
  100. try stdout.print("Start of Day {d} Part 2\n", .{day});
  101. try stdout.print("--" ** 20 ++ "\n", .{});
  102. try stdout.flush();
  103.  
  104. moving_loop: while (true) {
  105. var moved = false;
  106.  
  107. y = 0;
  108. while (y < placement.len) : (y += 1) {
  109. var x: usize = 0;
  110. while (x < placement[y].len) : (x += 1) {
  111. if (placement[y][x] == 1) {
  112. if (checkNeighbours(placement, x, y)) {
  113. movable_part_two += 1;
  114. const coords = Coords{ .x = x, .y = y };
  115. try coordinates_list.append(allocator, coords);
  116. moved = true;
  117. }
  118. }
  119. }
  120. }
  121.  
  122. // Moving the rolls
  123. for (coordinates_list.items) |coords| {
  124. const cx = coords.x;
  125. const cy = coords.y;
  126. placement[cy][cx] = 0;
  127. }
  128. coordinates_list.clearRetainingCapacity();
  129.  
  130. if (!moved) break :moving_loop;
  131. }
  132.  
  133. try stdout.print("Number of total rolls moved: {d}\n", .{movable_part_two});
  134. try stdout.flush();
  135. }
  136.  
  137. pub fn main() !void {
  138. var stdout_buffer: [1024]u8 = undefined;
  139. var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
  140. const stdout = &stdout_writer.interface;
  141. const day: u8 = 4;
  142. try stdout.print("Start of Day {d} Part 1\n", .{day});
  143. try stdout.print("--" ** 20 ++ "\n", .{});
  144. try stdout.flush();
  145. var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
  146. defer arena.deinit();
  147. const allocator = arena.allocator();
  148. try dayFourBothParts(stdout, allocator);
  149. }
  150.  
Advertisement
Add Comment
Please, Sign In to add comment