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})); }