| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- const std = @import("std");
- var allocatorBuffer: [10*1024*1024]u8 = undefined;
- fn findLargestDigitPos(batteryLine: []const u8) usize {
- var largestPos: usize = 0;
- var largestDigit: u8 = 0;
- for (batteryLine, 0..) |digit, pos| {
- if (digit > largestDigit) {
- largestDigit = digit;
- largestPos = pos;
- }
- }
- return largestPos;
- }
- pub fn main() !void {
- var fb_alloc = std.heap.FixedBufferAllocator.init(&allocatorBuffer);
- var allocator = fb_alloc.allocator();
- var printBuf: [1024]u8 = undefined;
- const inputFile = try std.fs.cwd().openFile(
- "input.txt",
- .{
- .mode = .read_only,
- },
- );
- defer inputFile.close();
- var inputFileBuffer: [1024]u8 = undefined;
- var inputFileReader = inputFile.reader(&inputFileBuffer);
- const inputFileSize = try inputFileReader.getSize();
- const inputBuffer = try allocator.alloc(u8, inputFileSize);
- try inputFileReader.interface.readSliceAll(inputBuffer);
- var counter:u64 = 0;
- var it = std.mem.tokenizeScalar(u8, inputBuffer, '\n');
- while (it.next()) |batteryLine| {
- var joltage:u64 = 0;
- var remainderLine = batteryLine;
- for (0..12) |digitOffset| {
- const minSuffix:usize = @intCast(12 - digitOffset - 1);
- const largestPos = findLargestDigitPos(remainderLine[0..remainderLine.len-minSuffix]);
- joltage *= 10;
- joltage += remainderLine[largestPos] - '0';
- remainderLine = remainderLine[largestPos+1..];
- }
- counter += joltage;
- }
- try std.fs.File.stdout().writeAll(
- try std.fmt.bufPrint(&printBuf, "{}\n", .{counter}));
- }
|