day3a.zig 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. const std = @import("std");
  2. const allocator = std.heap.page_allocator;
  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 printBuf: [1024]u8 = undefined;
  16. const inputFile = try std.fs.cwd().openFile(
  17. "input.txt",
  18. .{
  19. .mode = .read_only,
  20. },
  21. );
  22. defer inputFile.close();
  23. var inputFileBuffer: [1024]u8 = undefined;
  24. var inputFileReader = inputFile.reader(&inputFileBuffer);
  25. const inputFileSize = try inputFileReader.getSize();
  26. const inputBuffer = try allocator.alloc(u8, inputFileSize);
  27. try inputFileReader.interface.readSliceAll(inputBuffer);
  28. var counter:u64 = 0;
  29. var it = std.mem.tokenizeScalar(u8, inputBuffer, '\n');
  30. while (it.next()) |batteryLine| {
  31. const largestPos = findLargestDigitPos(batteryLine[0..batteryLine.len-1]);
  32. const secondLargestPos = findLargestDigitPos(batteryLine[largestPos+1..]) + largestPos + 1;
  33. counter += @intCast((batteryLine[largestPos] - '0') * 10 +
  34. (batteryLine[secondLargestPos] - '0'));
  35. }
  36. try std.fs.File.stdout().writeAll(
  37. try std.fmt.bufPrint(&printBuf, "{}\n", .{counter}));
  38. }