summaryrefslogtreecommitdiff
path: root/2.c
diff options
context:
space:
mode:
authorAdam Spragg <adam@spra.gg>2023-01-14 17:57:58 +0000
committerAdam Spragg <adam@spra.gg>2023-01-14 17:57:58 +0000
commit2b922997fb893a5bc14f157ad5db27ae77cec6a6 (patch)
treedc40826bd32e807ea1a04cd376c6067ec41b94a7 /2.c
parenta09348694b0525513d812647a69dac3a36782f88 (diff)
Puzzle 2: Consolidate 2a/2b programs into `2` with `-p` option
Like the later puzzles
Diffstat (limited to '2.c')
-rw-r--r--2.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/2.c b/2.c
new file mode 100644
index 0000000..0fcd959
--- /dev/null
+++ b/2.c
@@ -0,0 +1,128 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+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;
+}
+