AOC2022/zig/3/part2.zig

59 lines
1.6 KiB
Zig

const std = @import("std");
const lcConversion = 'a';
const ucConversion = 'A' - 26;
const charIndexer = struct {
pub const Key = u8;
pub const count: usize = 52;
pub fn indexOf(e: u8) usize {
return letterToIdx(e);
}
pub fn keyForIndex(i: usize) u8 {
return idxToLetter(i);
}
};
const CharSet: type = std.enums.IndexedSet(charIndexer, std.enums.NoExtension);
fn letterToIdx(char: u8) u8 {
return switch (char) {
'a'...'z' => char - lcConversion,
'A'...'Z' => char - ucConversion,
else => unreachable,
};
}
fn idxToLetter(i: usize) u8 {
const char = @intCast(u8, i);
return if (char < 26) char + lcConversion else char + ucConversion;
}
pub fn main() !void {
var file = try std.fs.cwd().openFile("input.txt", .{});
defer file.close();
var a = std.io.bufferedReader(file.reader());
var readerStream = a.reader();
var buf: [200]u8 = undefined;
var score: i32 = 0;
read: while (true) {
var bags = [_]CharSet{ .{}, .{}, .{} };
for (bags) |*bag| {
const maybeLine = try readerStream.readUntilDelimiterOrEof(&buf, '\n');
if (maybeLine) |line| {
for (line) |char| {
bag.setPresent(char, true);
}
} else break :read;
}
bags[0].setIntersection(bags[1]);
bags[0].setIntersection(bags[2]);
if (bags[0].count() != 1) unreachable; // ensure only one element in common
var iter = bags[0].iterator();
score += letterToIdx(iter.next().?) + 1;
}
std.debug.print("{d}\n", .{score});
}