#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum weapon { ROCK = 0, PAPER, SCISSORS };
enum outcome { LOSS = ROCK, TIE = PAPER, WIN = SCISSORS };
const int value[3] = { [ROCK] = 1, [PAPER] = 2, [SCISSORS] = 3 };
const int score[3] = { [LOSS] = 0, [TIE] = 3, [WIN] = 6 };
// Outcome score LUT, first dimension: my weapon, second dimension their weapon
const int outcomeScore[3][3] = { [ROCK] = { [ROCK] = score[TIE], [PAPER] = score[LOSS], [SCISSORS] = score[WIN] },
[PAPER] = { [ROCK] = score[WIN], [PAPER] = score[TIE], [SCISSORS] = score[LOSS] },
[SCISSORS] = { [ROCK] = score[LOSS], [PAPER] = score[WIN], [SCISSORS] = score[TIE] },
};
// My weapon value LUT for certain outcome, first dimension: outcome, second dimension: their weapon
const int valueGivenOutcome[3][3] = { [LOSS] = { [ROCK] = value[SCISSORS], [PAPER] = value[ROCK], [SCISSORS] = value[PAPER] },
[TIE] = { [ROCK] = value[ROCK], [PAPER] = value[PAPER], [SCISSORS] = value[SCISSORS] },
[WIN] = { [ROCK] = value[PAPER], [PAPER] = value[SCISSORS], [SCISSORS] = value[ROCK] },
};
int getWeaponOrOutcomeIdx(char chr) {
switch (chr) {
case 'A':
case 'X':
return ROCK;
case 'B':
case 'Y':
return PAPER;
case 'C':
case 'Z':
return SCISSORS;
default:
fprintf(stderr, "Unknown character: %c\n", chr);
exit(EXIT_FAILURE);
}
}
int main(void) {
char *line = NULL;
size_t len = 0;
ssize_t nread;
int totalScoreP1 = 0;
int totalScoreP2 = 0;
FILE *fp = fopen("d2_input.txt", "r");
if (!fp) {
perror("Failed to open file");
exit(EXIT_FAILURE);
}
while ((nread = getline(&line, &len, fp)) != -1) {
enum weapon theirIdx, myIdx;
char *tok = strtok(line, " \n");
if (!tok) exit(EXIT_FAILURE);
theirIdx = getWeaponOrOutcomeIdx(tok[0]);
tok = strtok(NULL, " \n");
if (!tok) exit(EXIT_FAILURE);
myIdx = getWeaponOrOutcomeIdx(tok[0]);
totalScoreP1 += value[myIdx] + outcomeScore[myIdx][theirIdx];
totalScoreP2 += valueGivenOutcome[myIdx][theirIdx] + score[myIdx];
}
free(line);
fclose(fp);
printf("totalScoreP1 = %d\n", totalScoreP1);
printf("totalScoreP2 = %d\n", totalScoreP2);
exit(EXIT_SUCCESS);
}