Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const std = @import("std");
- fn partOne(stdout: *std.Io.Writer) !void {
- const file = try std.fs.cwd().openFile("data.txt", .{ .mode = .read_only });
- defer file.close();
- var file_buffer: [4096]u8 = undefined;
- var file_reader = file.reader(&file_buffer);
- const reader = &file_reader.interface;
- var joltage_sum: u16 = 0;
- while (reader.takeDelimiterExclusive('\n')) |line| {
- var first_digit: u8 = 0;
- var second_digit: u8 = 0;
- reader.toss(1);
- var idx: u16 = 0;
- var first_idx: u16 = 0;
- while (idx < line.len - 1) : (idx += 1) { // Stops one index before the end, because we need atleast one character for the second_digit
- const num = line[idx] - '0';
- if (num > first_digit) {
- first_digit = num;
- first_idx = idx;
- }
- // Stop if digit == 9, because 9 is the largest
- if (first_digit == 9) break;
- }
- idx = first_idx + 1;
- while (idx < line.len) : (idx += 1) { // Stops one index before the end, because we need atleast one character for the second_digit
- const num = line[idx] - '0';
- if (num > second_digit) second_digit = num;
- // Stop if digit == 9, because 9 is the largest
- if (second_digit == 9) break;
- }
- const joltage = first_digit * 10 + second_digit;
- joltage_sum += joltage;
- } else |err| switch (err) {
- error.EndOfStream => {},
- else => return err,
- }
- try stdout.print("Total joltage: {d}\n", .{joltage_sum});
- try stdout.flush();
- }
- fn fillJoltageDigits(line: []const u8, joltage_digits: *[12]u8, remaining_digits: *u8, line_idx: *usize) void {
- const joltage_digits_idx: u8 = 12 - remaining_digits.*;
- var idx: usize = line_idx.*;
- var digit: u8 = 0;
- remaining_digits.* -= 1;
- while (idx < line.len - remaining_digits.*) : (idx += 1) {
- const num = line[idx] - '0';
- if (num > digit) {
- digit = num;
- line_idx.* = idx + 1;
- }
- if (digit == 9) break;
- }
- joltage_digits[joltage_digits_idx] = digit + '0';
- }
- fn partTwo(stdout: *std.Io.Writer) !void {
- const file = try std.fs.cwd().openFile("data.txt", .{ .mode = .read_only });
- defer file.close();
- var file_buffer: [4096]u8 = undefined;
- var file_reader = file.reader(&file_buffer);
- const reader = &file_reader.interface;
- var joltage_sum: u128 = 0;
- while (reader.takeDelimiterExclusive('\n')) |line| {
- reader.toss(1);
- var joltage_digits: [12]u8 = undefined;
- var remaining_digits: u8 = 12;
- var line_idx: usize = 0;
- while (remaining_digits > 0) {
- fillJoltageDigits(line, &joltage_digits, &remaining_digits, &line_idx);
- }
- const joltage = try std.fmt.parseInt(u64, &joltage_digits, 10);
- joltage_sum += joltage;
- } else |err| switch (err) {
- error.EndOfStream => {},
- else => return err,
- }
- try stdout.print("Total joltage: {d}\n", .{joltage_sum});
- try stdout.flush();
- }
- pub fn main() !void {
- var stdout_buffer: [1024]u8 = undefined;
- var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
- const stdout = &stdout_writer.interface;
- const day: u8 = 3;
- try stdout.print("Start of Day {d} Part 1\n", .{day});
- try stdout.print("--" ** 20 ++ "\n", .{});
- try stdout.flush();
- try partOne(stdout);
- try stdout.print("--" ** 20 ++ "\n", .{});
- try stdout.print("Start of Day {d} Part 2\n", .{day});
- try stdout.print("--" ** 20 ++ "\n", .{});
- try stdout.flush();
- try partTwo(stdout);
- }
Advertisement
Add Comment
Please, Sign In to add comment