This repository has been archived on 2022-12-11. You can view files and clone it, but cannot push or open issues or pull requests.
aoc2022/02/1.zig

62 lines
1.8 KiB
Zig
Raw Permalink Normal View History

2022-12-02 14:31:23 +00:00
const std = @import("std");
pub fn main() void {
2022-12-08 16:22:18 +00:00
const input = @embedFile("input");
2022-12-02 14:31:23 +00:00
var iter = std.mem.split(u8, input, "\n");
var totalPoints: usize = 0;
while (iter.next()) |round| {
// Not a valid round. Not necessary, but just in case
if (round.len < 3) continue;
if (round[0] < 'A' or round[0] > 'C') continue;
if (round[2] < 'X' or round[2] > 'Z') continue;
// Convert letters to numbers
const them = round[0] - 'A';
const me = round[2] - 'X';
// Points per shape chosen is easy.
// {0,1,2} + 1 == {1,2,3}
// which is what we want.
2022-12-08 16:22:18 +00:00
const shapePoints = me + 1;
2022-12-02 14:31:23 +00:00
// Now this is a bit more complex.
// We notice that 'them - me' gives:
//
// tie = 0;
// die = both -2 or 1;
// win = both -1 or 2;
//
// If we wrap the results (adding 3 before because
// we can't have negatives) 'result = (result+3)%3'
// we get
//
// tie = 0; -> 3 points
// die = 1; -> 0 points
// win = 2; -> 6 points
//
// Ideally we would want {0,1,2} to be {0,3,6}, not
// {3,0,6}. If we adjust it to '(result+4)%3' we get:
//
// win = 0; -> 6 points
// tie = 1; -> 3 points
// die = 2; -> 0 points
//
// That's closer but not ideal. If we invert the
// numbers then we do get there '2-(result+4)%3':
//
// die = 0; -> 0 points
// tie = 1; -> 3 points
// win = 2; -> 6 points
//
// Now we multiply by three so '(2-(result+4)%3)*3'
// and boom, points per result per match.
2022-12-08 16:22:18 +00:00
const resultPoints = (2 - ((4 + them) - me) % 3) * 3;
2022-12-02 14:31:23 +00:00
totalPoints += resultPoints + shapePoints;
}
std.debug.print("{}\n", .{totalPoints});
}