day3b.zig 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const std = @import("std");
  2. var allocatorBuffer: [10*1024*1024]u8 = undefined;
  3. fn findLargestDigitPos(batteryLine: []const u8) usize {
  4. var largestPos: usize = 0;
  5. var largestDigit: u8 = 0;
  6. for (batteryLine, 0..) |digit, pos| {
  7. if (digit > largestDigit) {
  8. largestDigit = digit;
  9. largestPos = pos;
  10. }
  11. }
  12. return largestPos;
  13. }
  14. pub fn main() !void {
  15. var fb_alloc = std.heap.FixedBufferAllocator.init(&allocatorBuffer);
  16. var allocator = fb_alloc.allocator();
  17. var printBuf: [1024]u8 = undefined;
  18. const inputFile = try std.fs.cwd().openFile(
  19. "input.txt",
  20. .{
  21. .mode = .read_only,
  22. },
  23. );
  24. defer inputFile.close();
  25. var inputFileBuffer: [1024]u8 = undefined;
  26. var inputFileReader = inputFile.reader(&inputFileBuffer);
  27. const inputFileSize = try inputFileReader.getSize();
  28. const inputBuffer = try allocator.alloc(u8, inputFileSize);
  29. try inputFileReader.interface.readSliceAll(inputBuffer);
  30. var counter:u64 = 0;
  31. var it = std.mem.tokenizeScalar(u8, inputBuffer, '\n');
  32. while (it.next()) |batteryLine| {
  33. var joltage:u64 = 0;
  34. var remainderLine = batteryLine;
  35. for (0..12) |digitOffset| {
  36. const minSuffix:usize = @intCast(12 - digitOffset - 1);
  37. const largestPos = findLargestDigitPos(remainderLine[0..remainderLine.len-minSuffix]);
  38. joltage *= 10;
  39. joltage += remainderLine[largestPos] - '0';
  40. remainderLine = remainderLine[largestPos+1..];
  41. }
  42. counter += joltage;
  43. }
  44. try std.fs.File.stdout().writeAll(
  45. try std.fmt.bufPrint(&printBuf, "{}\n", .{counter}));
  46. }