77 lines
2.0 KiB
Zig
77 lines
2.0 KiB
Zig
const std = @import("std");
|
|
|
|
pub fn find_intersection2(array1: []u8, array2: []u8) ?u8 {
|
|
for (array1) |item1| {
|
|
for (array2) |item2| {
|
|
if (item1 == item2) {
|
|
return item2;
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
pub fn find_intersection3(array1: []u8, array2: []u8, array3: []u8) ?u8 {
|
|
for (array1) |item1| {
|
|
for (array2) |item2| {
|
|
for (array3) |item3| {
|
|
if ((item1 == item2) and (item2 == item3)) {
|
|
return item3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
return null;
|
|
}
|
|
|
|
pub fn get_priority_value(val: u8) u32 {
|
|
if (val >= 'a') {
|
|
return @intCast(u32, val) - 'a' + 1;
|
|
}
|
|
else {
|
|
return @intCast(u32, val) - 'A' + 27;
|
|
}
|
|
}
|
|
|
|
pub fn main() !void {
|
|
var file = try std.fs.cwd().openFile("inputs/day3.txt", .{});
|
|
defer file.close();
|
|
|
|
var buf_reader = std.io.bufferedReader(file.reader());
|
|
var in_stream = buf_reader.reader();
|
|
|
|
var buf: [1024]u8 = undefined;
|
|
var pirority_sum1: u32 = 0;
|
|
var pirority_sum2: u32 = 0;
|
|
var line_number: u32 = 0;
|
|
var group: [3][1024]u8 = [3][1024]u8 {[_]u8{0} ** 1024, [_]u8{0} ** 1024, [_]u8{0} ** 1024};
|
|
while (try in_stream.readUntilDelimiterOrEof(&buf, '\n')) |line| {
|
|
const len = line.len;
|
|
|
|
var compartment1 = line[0..len/2];
|
|
var compartment2 = line[len/2..];
|
|
|
|
const intersection = find_intersection2(compartment1, compartment2).?;
|
|
|
|
pirority_sum1 += get_priority_value(intersection);
|
|
|
|
std.mem.copy(u8, &group[line_number % 3], line);
|
|
|
|
if ((line_number % 3) == 2) {
|
|
const intersection2 = find_intersection3(&group[0], &group[1], &group[2]).?;
|
|
|
|
pirority_sum2 += get_priority_value(intersection2);
|
|
|
|
std.mem.set([1024]u8, &group, [_]u8{0}**1024);
|
|
}
|
|
|
|
line_number += 1;
|
|
}
|
|
|
|
|
|
std.debug.print("PART1 Sum of all priorties is: {}\n", .{pirority_sum1});
|
|
std.debug.print("PART2 Sum of all priorties is: {}\n", .{pirority_sum2});
|
|
} |