stayerc

Advent Of Code 2025 Day 7

Dec 7th, 2025
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.97 KB | Software | 0 0
  1. const std = @import("std");
  2.  
  3. pub fn computePartTwo(space: [][]u8, allocator: std.mem.Allocator) !u64 {
  4. const rows = space.len;
  5. const cols = space[0].len;
  6.  
  7. const cell_count = rows * cols;
  8.  
  9. var dp = try allocator.alloc(u64, cell_count);
  10. @memset(dp, 0);
  11.  
  12. var start_r: usize = 0;
  13. var start_c: usize = 0;
  14. var found = false;
  15. for (0..rows) |r| {
  16. for (0..cols) |c| {
  17. if (space[r][c] == 'S') {
  18. start_r = r;
  19. start_c = c;
  20. found = true;
  21. break;
  22. }
  23. }
  24. if (found) break;
  25. }
  26. if (!found) {
  27. allocator.free(dp);
  28. return 0;
  29. }
  30.  
  31. dp[start_r * cols + start_c] = 1;
  32.  
  33. var r: usize = start_r;
  34. while (r + 1 < rows) : (r += 1) {
  35. const next_row = r + 1;
  36. for (0..cols) |c| {
  37. const idx = r * cols + c;
  38. const count = dp[idx];
  39. if (count == 0) continue;
  40.  
  41. const ch = space[r][c];
  42.  
  43. if (ch == '^') {
  44. if (c > 0) dp[next_row * cols + (c - 1)] += count;
  45. if (c + 1 < cols) dp[next_row * cols + (c + 1)] += count;
  46. } else {
  47. dp[next_row * cols + c] += count;
  48. }
  49. }
  50. }
  51.  
  52. var total: u64 = 0;
  53. const bottom_row = rows - 1;
  54. for (0..cols) |c| {
  55. total += dp[bottom_row * cols + c];
  56. }
  57.  
  58. allocator.free(dp);
  59. return total;
  60. }
  61.  
  62. fn advanceBeam(space: [][]u8, line_number: usize, splitters: *u16) void {
  63. const length = space[line_number].len;
  64. var idx: usize = 0;
  65. while (idx < length) : (idx += 1) {
  66. if (space[line_number][idx] == 'S' or space[line_number][idx] == '|') {
  67. if (space[line_number + 1][idx] == '^') {
  68. splitters.* += 1;
  69. space[line_number + 1][idx - 1] = '|';
  70. space[line_number + 1][idx + 1] = '|';
  71. } else {
  72. space[line_number + 1][idx] = '|';
  73. }
  74. }
  75. }
  76. }
  77.  
  78. fn daySevenBothParts(stdout: *std.Io.Writer, allocator: std.mem.Allocator) !void {
  79. const file = try std.fs.cwd().openFile("data.txt", .{ .mode = .read_only });
  80. defer file.close();
  81.  
  82. var file_buffer: [4096]u8 = undefined;
  83. var file_reader = file.reader(&file_buffer);
  84. const reader = &file_reader.interface;
  85.  
  86. var splitters: u16 = 0;
  87. var list: std.ArrayList([]u8) = .empty;
  88. defer list.deinit(allocator);
  89.  
  90. while (reader.takeDelimiterExclusive('\n')) |line| {
  91. reader.toss(1);
  92.  
  93. const dupl = try allocator.dupe(u8, line);
  94. try list.append(allocator, dupl);
  95. } else |err| switch (err) {
  96. error.EndOfStream => {},
  97. else => return err,
  98. }
  99.  
  100. const space = try list.toOwnedSlice(allocator);
  101.  
  102. // We calculate timelines on clean space, because its faster
  103. const timelines = try computePartTwo(space, allocator);
  104.  
  105. const steps = space.len - 1;
  106. for (0..steps) |step| {
  107. advanceBeam(space, step, &splitters);
  108. }
  109.  
  110. try stdout.print("A tachyon beam is split a total of {d} times.\n", .{splitters});
  111. try stdout.flush();
  112.  
  113. const day: u8 = 7;
  114. try stdout.print("--" ** 20 ++ "\n", .{});
  115. try stdout.print("Start of Day {d} Part 2\n", .{day});
  116. try stdout.print("--" ** 20 ++ "\n", .{});
  117.  
  118. try stdout.print("Those {d} splits create {d} timelines.\n", .{ splitters, timelines });
  119. try stdout.flush();
  120. }
  121.  
  122. pub fn main() !void {
  123. var stdout_buffer: [1024]u8 = undefined;
  124. var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
  125. const stdout = &stdout_writer.interface;
  126. const day: u8 = 7;
  127. try stdout.print("Start of Day {d} Part 1\n", .{day});
  128. try stdout.print("--" ** 20 ++ "\n", .{});
  129. try stdout.flush();
  130. var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
  131. defer arena.deinit();
  132. const allocator = arena.allocator();
  133. try daySevenBothParts(stdout, allocator);
  134. }
  135.  
Advertisement
Add Comment
Please, Sign In to add comment