diff options
author | Adam Spragg <adam@spra.gg> | 2023-01-15 10:34:50 +0000 |
---|---|---|
committer | Adam Spragg <adam@spra.gg> | 2023-01-15 10:34:50 +0000 |
commit | 3dd30be057332cd764ee79a26673a775336322eb (patch) | |
tree | cabb7c293fa2d587a217916b6e519f98e3cd7cb6 | |
parent | 2b922997fb893a5bc14f157ad5db27ae77cec6a6 (diff) |
Puzzle 3: Consolidate 3a/3b programs into `3` with `-p` option
Like the later puzzles
-rw-r--r-- | 3.c (renamed from 3b.c) | 82 | ||||
-rw-r--r-- | 3a.c | 65 | ||||
-rw-r--r-- | makefile | 2 |
3 files changed, 80 insertions, 69 deletions
@@ -2,6 +2,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> int @@ -38,7 +39,48 @@ min3(int a, int b, int c) int -main() +rucksack_common_sum() +{ + char buf[BUFSIZ]; + int score = 0; + + while (fgets(buf, sizeof(buf), stdin)) { + int len, i, j; + + len = strlen(buf); + if (len && buf[len - 1] == '\n') + --len; + if (len % 2 == 1) { + fprintf(stderr, "Unexpected length: %d\n", len); + return -1; + } + + qsort(buf, len / 2, 1, chrcmp); + qsort(buf + len / 2, len / 2, 1, chrcmp); + + i = 0; + j = len / 2; + while (i < len / 2 && j < len) { + if (buf[i] < buf[j]) + ++i; + else if (buf[j] < buf[i]) + ++j; + else + break; + } + if (i >= len / 2 || j >= len) { + fprintf(stderr, "No match found in %s\n", buf); + return -1; + } + score += priority(buf[i]); + } + + return score; +} + + +int +group_badge_sum() { char buf[3][BUFSIZ]; int score = 0; @@ -55,8 +97,10 @@ main() --len; buf[n][len] = '\0'; } - if (len % 2 == 1) + if (len % 2 == 1) { fprintf(stderr, "Unexpected length: %d\n", len); + return -1; + } qsort(buf[n], len, 1, chrcmp); } @@ -80,7 +124,39 @@ main() score += priority(buf[0][i]); } - printf("Score: %d\n", score); + return score; +} + + +int +main(int argc, char ** argv) +{ + int part = 1, i; + + while ((i = getopt(argc, argv, "p:")) != -1) { + switch (i) { + case 'p': + part = atoi(optarg); + break; + + default: + return -1; + } + } + + switch (part) { + case 1: + printf("Score: %d\n", rucksack_common_sum()); + break; + + case 2: + printf("Score: %d\n", group_badge_sum()); + break; + + default: + fprintf(stderr, "Unexpected puzzle part %d\n", part); + return -1; + } return 0; } @@ -1,65 +0,0 @@ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -int -chrcmp(void const * a, void const * b) -{ - return (*(char const *) a) - *((char const *) b); -} - - -int -priority(int c) -{ - if (c >= 'A' && c <= 'Z') - return 27 + c - 'A'; - if (c >= 'a' && c <= 'z') - return 1 + c - 'a'; - fprintf(stderr, "Unexpected priority request: %c\n", c); - return -1; -} - - -int -main() -{ - char buf[BUFSIZ]; - int score = 0; - - while (fgets(buf, sizeof(buf), stdin)) { - int len, i, j; - - len = strlen(buf); - if (len && buf[len - 1] == '\n') - --len; - if (len % 2 == 1) - fprintf(stderr, "Unexpected length: %d\n", len); - - qsort(buf, len / 2, 1, chrcmp); - qsort(buf + len / 2, len / 2, 1, chrcmp); - - i = 0; - j = len / 2; - while (i < len / 2 && j < len) { - if (buf[i] < buf[j]) - ++i; - else if (buf[j] < buf[i]) - ++j; - else - break; - } - if (i >= len / 2 || j >= len) { - fprintf(stderr, "No match found in %s\n", buf); - return -1; - } - score += priority(buf[i]); - } - - printf("Score: %d\n", score); - - return 0; -} - @@ -4,7 +4,7 @@ CFLAGS=-Wall -O2 all: bin \ bin/1 \ bin/2 \ - bin/3a bin/3b \ + bin/3 \ bin/4a bin/4b \ bin/5 \ bin/6 \ |