summaryrefslogtreecommitdiff
path: root/day-2/main_1.zig
diff options
context:
space:
mode:
authorChristian Segundo2022-12-02 09:20:45 +0100
committerChristian Segundo2022-12-02 09:57:49 +0100
commit6990eb44ae6111ac18667e416dc4dc2883c50f25 (patch)
tree61798deb9ee52c47215ebe9addb7ad225316e28a /day-2/main_1.zig
parent77623e0a5bdbfb271bc02f26cf2b377ec16b55ec (diff)
downloadadvent-of-zig-2022-6990eb44ae6111ac18667e416dc4dc2883c50f25.tar.gz
add day 2
Diffstat (limited to 'day-2/main_1.zig')
-rw-r--r--day-2/main_1.zig68
1 files changed, 68 insertions, 0 deletions
diff --git a/day-2/main_1.zig b/day-2/main_1.zig
new file mode 100644
index 0000000..51d6b65
--- /dev/null
+++ b/day-2/main_1.zig
@@ -0,0 +1,68 @@
+const std = @import("std");
+const slurp = @import("util/file.zig").slurp;
+
+var gpa = std.heap.GeneralPurposeAllocator(.{}){};
+const allocator = gpa.allocator();
+
+const Hand = enum(u8) { Rock = 1, Paper = 2, Scissors = 3 };
+const Outcome = enum(u8) { Win = 6, Draw = 3, Lose = 0 };
+
+const KV_Hand = struct { @"0": []const u8, @"1": Hand };
+const KV_Outcome = struct { @"0": []const u8, @"1": Outcome };
+
+const Player_A_KV = std.ComptimeStringMap(Hand, [_]KV_Hand{
+ .{ .@"0" = "A", .@"1" = .Rock },
+ .{ .@"0" = "B", .@"1" = .Paper },
+ .{ .@"0" = "C", .@"1" = .Scissors },
+});
+
+const Outcome_KV = std.ComptimeStringMap(Outcome, [_]KV_Outcome{
+ .{ .@"0" = "X", .@"1" = .Lose },
+ .{ .@"0" = "Y", .@"1" = .Draw },
+ .{ .@"0" = "Z", .@"1" = .Win },
+});
+
+pub fn main() !void {
+ const file_buffer = try slurp(allocator, "./input");
+ defer allocator.free(file_buffer);
+
+ var iter = std.mem.split(u8, file_buffer, "\n");
+
+ var score: u16 = 0;
+
+ while (iter.next()) |line| {
+ if (line.len > 0)
+ score += match(
+ Player_A_KV.get(&[_]u8{line[0]}).?,
+ Outcome_KV.get(&[_]u8{line[2]}).?,
+ );
+ }
+
+ std.debug.print("{d}\n", .{score});
+}
+
+fn match(a: Hand, b: Outcome) u8 {
+ switch (a) {
+ .Rock => {
+ switch (b) {
+ .Win => return @enumToInt(b) + @enumToInt(Hand.Paper),
+ .Lose => return @enumToInt(b) + @enumToInt(Hand.Scissors),
+ .Draw => return @enumToInt(b) + @enumToInt(Hand.Rock),
+ }
+ },
+ .Paper => {
+ switch (b) {
+ .Win => return @enumToInt(b) + @enumToInt(Hand.Scissors),
+ .Lose => return @enumToInt(b) + @enumToInt(Hand.Rock),
+ .Draw => return @enumToInt(b) + @enumToInt(Hand.Paper),
+ }
+ },
+ .Scissors => {
+ switch (b) {
+ .Win => return @enumToInt(b) + @enumToInt(Hand.Rock),
+ .Lose => return @enumToInt(b) + @enumToInt(Hand.Paper),
+ .Draw => return @enumToInt(b) + @enumToInt(Hand.Scissors),
+ }
+ },
+ }
+}