stayerc

Advent Of Code 2025 Day 3

Dec 3rd, 2025
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.72 KB | Source Code | 0 0
  1. const std = @import("std");
  2.  
  3. fn partOne(stdout: *std.Io.Writer) !void {
  4. const file = try std.fs.cwd().openFile("data.txt", .{ .mode = .read_only });
  5. defer file.close();
  6.  
  7. var file_buffer: [4096]u8 = undefined;
  8. var file_reader = file.reader(&file_buffer);
  9. const reader = &file_reader.interface;
  10.  
  11. var joltage_sum: u16 = 0;
  12.  
  13. while (reader.takeDelimiterExclusive('\n')) |line| {
  14. var first_digit: u8 = 0;
  15. var second_digit: u8 = 0;
  16.  
  17. reader.toss(1);
  18.  
  19. var idx: u16 = 0;
  20. var first_idx: u16 = 0;
  21. while (idx < line.len - 1) : (idx += 1) { // Stops one index before the end, because we need atleast one character for the second_digit
  22. const num = line[idx] - '0';
  23. if (num > first_digit) {
  24. first_digit = num;
  25. first_idx = idx;
  26. }
  27. // Stop if digit == 9, because 9 is the largest
  28. if (first_digit == 9) break;
  29. }
  30.  
  31. idx = first_idx + 1;
  32. while (idx < line.len) : (idx += 1) { // Stops one index before the end, because we need atleast one character for the second_digit
  33. const num = line[idx] - '0';
  34. if (num > second_digit) second_digit = num;
  35.  
  36. // Stop if digit == 9, because 9 is the largest
  37. if (second_digit == 9) break;
  38. }
  39.  
  40. const joltage = first_digit * 10 + second_digit;
  41.  
  42. joltage_sum += joltage;
  43. } else |err| switch (err) {
  44. error.EndOfStream => {},
  45. else => return err,
  46. }
  47.  
  48. try stdout.print("Total joltage: {d}\n", .{joltage_sum});
  49. try stdout.flush();
  50. }
  51.  
  52. fn fillJoltageDigits(line: []const u8, joltage_digits: *[12]u8, remaining_digits: *u8, line_idx: *usize) void {
  53. const joltage_digits_idx: u8 = 12 - remaining_digits.*;
  54. var idx: usize = line_idx.*;
  55. var digit: u8 = 0;
  56.  
  57. remaining_digits.* -= 1;
  58. while (idx < line.len - remaining_digits.*) : (idx += 1) {
  59. const num = line[idx] - '0';
  60. if (num > digit) {
  61. digit = num;
  62. line_idx.* = idx + 1;
  63. }
  64.  
  65. if (digit == 9) break;
  66. }
  67.  
  68. joltage_digits[joltage_digits_idx] = digit + '0';
  69. }
  70.  
  71. fn partTwo(stdout: *std.Io.Writer) !void {
  72. const file = try std.fs.cwd().openFile("data.txt", .{ .mode = .read_only });
  73. defer file.close();
  74.  
  75. var file_buffer: [4096]u8 = undefined;
  76. var file_reader = file.reader(&file_buffer);
  77. const reader = &file_reader.interface;
  78.  
  79. var joltage_sum: u128 = 0;
  80.  
  81. while (reader.takeDelimiterExclusive('\n')) |line| {
  82. reader.toss(1);
  83.  
  84. var joltage_digits: [12]u8 = undefined;
  85. var remaining_digits: u8 = 12;
  86. var line_idx: usize = 0;
  87.  
  88. while (remaining_digits > 0) {
  89. fillJoltageDigits(line, &joltage_digits, &remaining_digits, &line_idx);
  90. }
  91.  
  92. const joltage = try std.fmt.parseInt(u64, &joltage_digits, 10);
  93. joltage_sum += joltage;
  94. } else |err| switch (err) {
  95. error.EndOfStream => {},
  96. else => return err,
  97. }
  98.  
  99. try stdout.print("Total joltage: {d}\n", .{joltage_sum});
  100. try stdout.flush();
  101. }
  102.  
  103. pub fn main() !void {
  104. var stdout_buffer: [1024]u8 = undefined;
  105. var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
  106. const stdout = &stdout_writer.interface;
  107. const day: u8 = 3;
  108. try stdout.print("Start of Day {d} Part 1\n", .{day});
  109. try stdout.print("--" ** 20 ++ "\n", .{});
  110. try stdout.flush();
  111. try partOne(stdout);
  112. try stdout.print("--" ** 20 ++ "\n", .{});
  113. try stdout.print("Start of Day {d} Part 2\n", .{day});
  114. try stdout.print("--" ** 20 ++ "\n", .{});
  115. try stdout.flush();
  116. try partTwo(stdout);
  117. }
  118.  
Advertisement
Add Comment
Please, Sign In to add comment