stayerc

Advent Of Code 2025 Day 5

Dec 5th, 2025
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.49 KB | Source Code | 0 0
  1. const std = @import("std");
  2. const parseInt = std.fmt.parseInt;
  3.  
  4. const ID_Ranges = struct {
  5. min: u64,
  6. max: u64,
  7. };
  8.  
  9. fn checkFreshness(id: u64, ranges: []ID_Ranges) bool {
  10. for (ranges) |range| {
  11. const min = range.min;
  12. const max = range.max;
  13. if (id >= min and id <= max) return true;
  14. }
  15.  
  16. return false;
  17. }
  18.  
  19. fn dayFiveBothParts(stdout: *std.Io.Writer, allocator: std.mem.Allocator) !void {
  20. const file = try std.fs.cwd().openFile("data.txt", .{ .mode = .read_only });
  21. defer file.close();
  22.  
  23. var file_buffer: [4096]u8 = undefined;
  24. var file_reader = file.reader(&file_buffer);
  25. const reader = &file_reader.interface;
  26.  
  27. var ranges_list: std.ArrayList(ID_Ranges) = .empty;
  28. defer ranges_list.deinit(allocator);
  29.  
  30. while (reader.takeDelimiterExclusive('\n')) |line| {
  31. reader.toss(1);
  32. if (line.len == 0) break;
  33.  
  34. var it = std.mem.splitAny(u8, line, "-");
  35. const first_str = it.next().?;
  36. const min = try parseInt(u64, first_str, 10);
  37. const second_str = it.next().?;
  38. const max = try parseInt(u64, second_str, 10);
  39. const range = ID_Ranges{ .min = min, .max = max };
  40. try ranges_list.append(allocator, range);
  41. } else |err| switch (err) {
  42. error.EndOfStream => {},
  43. else => return err,
  44. }
  45.  
  46. const ranges = try ranges_list.toOwnedSlice(allocator);
  47.  
  48. var id_list: std.ArrayList(u64) = .empty;
  49. defer id_list.deinit(allocator);
  50.  
  51. while (reader.takeDelimiterExclusive('\n')) |line| {
  52. reader.toss(1);
  53. const id = try parseInt(u64, line, 10);
  54. try id_list.append(allocator, id);
  55. } else |err| switch (err) {
  56. error.EndOfStream => {},
  57. else => return err,
  58. }
  59.  
  60. var fresh_ids: u16 = 0;
  61.  
  62. for (id_list.items) |id| {
  63. if (checkFreshness(id, ranges)) fresh_ids += 1;
  64. }
  65. try stdout.print("Number of fresh IDs: {d}\n", .{fresh_ids});
  66. try stdout.flush();
  67.  
  68. try stdout.print("--" ** 20 ++ "\n", .{});
  69. const day: u8 = 5;
  70. try stdout.print("Start of Day {d} Part 2\n", .{day});
  71. try stdout.print("--" ** 20 ++ "\n", .{});
  72. try stdout.flush();
  73.  
  74. std.mem.sort(ID_Ranges, ranges, {}, struct {
  75. fn lessThan(_: void, a: ID_Ranges, b: ID_Ranges) bool {
  76. return a.min < b.min;
  77. }
  78. }.lessThan);
  79.  
  80. var merged: std.ArrayList(ID_Ranges) = .empty;
  81. defer merged.deinit(allocator);
  82.  
  83. try merged.append(allocator, ranges[0]);
  84.  
  85. for (ranges[1..]) |range| {
  86. var last = &merged.items[merged.items.len - 1];
  87.  
  88. if (range.min <= last.max + 1) {
  89. if (range.max > last.max) last.max = range.max;
  90. } else {
  91. try merged.append(allocator, range);
  92. }
  93. }
  94.  
  95. var total: u64 = 0;
  96. for (merged.items) |range| {
  97. total += (range.max - range.min + 1);
  98. }
  99.  
  100. try stdout.print("Total fresh IDs: {d}\n", .{total});
  101. try stdout.flush();
  102. }
  103.  
  104. pub fn main() !void {
  105. var stdout_buffer: [1024]u8 = undefined;
  106. var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
  107. const stdout = &stdout_writer.interface;
  108. const day: u8 = 5;
  109. try stdout.print("Start of Day {d} Part 1\n", .{day});
  110. try stdout.print("--" ** 20 ++ "\n", .{});
  111. try stdout.flush();
  112. var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
  113. defer arena.deinit();
  114. const allocator = arena.allocator();
  115. try dayFiveBothParts(stdout, allocator);
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment