#include #include #include #include enum RPS { ROCK, PAPR, SCRS, }; enum RPS rps_beats(enum RPS rps) { switch (rps) { case ROCK: return SCRS; case PAPR: return ROCK; case SCRS: return PAPR; } return -1; } enum RPS rps_loses(enum RPS rps) { switch (rps) { case ROCK: return PAPR; case PAPR: return SCRS; case SCRS: return ROCK; } return -1; } int rps_pickscore(enum RPS rps) { switch (rps) { case ROCK: return 1; case PAPR: return 2; case SCRS: return 3; } return 0; } int rps_gamescore_b(enum RPS a, enum RPS b) { if (b == a) return 3; if (rps_beats(b) == a) return 6; return 0; } int main(int argc, char ** argv) { int part = 1, i; char buf[BUFSIZ]; int score = 0; while ((i = getopt(argc, argv, "p:")) != -1) { switch (i) { case 'p': part = atoi(optarg); break; default: return -1; } } while (fgets(buf, sizeof(buf), stdin)) { enum RPS a, b; if (strlen(buf) != 4) break; switch (buf[0]) { case 'A': a = ROCK; break; case 'B': a = PAPR; break; case 'C': a = SCRS; break; default: fprintf(stderr, "Unexpected input: %c (0x%2d)\n", buf[0], buf[0]); return -1; } switch (part) { case 1: switch (buf[2]) { case 'X': b = ROCK; break; case 'Y': b = PAPR; break; case 'Z': b = SCRS; break; default: fprintf(stderr, "Unexpected input: %c (0x%2d)\n", buf[2], buf[2]); return -1; } break; case 2: switch (buf[2]) { case 'X': b = rps_beats(a); break; case 'Y': b = a; break; case 'Z': b = rps_loses(a); break; default: fprintf(stderr, "Unexpected input: %c (0x%2d)\n", buf[2], buf[2]); return -1; } break; default: fprintf(stderr, "Unexpected puzzle part %d\n", part); return -1; } score += rps_pickscore(b) + rps_gamescore_b(a, b); } printf("Score: %d\n", score); return 0; }