|
|
@@ -0,0 +1,59 @@
|
|
|
+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}));
|
|
|
+}
|
|
|
+
|