day 10
[advent21.git] / 10b.c
diff --git a/10b.c b/10b.c
new file mode 100644 (file)
index 0000000..e8fef98
--- /dev/null
+++ b/10b.c
@@ -0,0 +1,55 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+char cmap[] = { [')']='(', [']']='[', ['}']='{', ['>']='<' };
+long rmap[] = { ['(']=1, ['[']=2, ['{']=3, ['<']=4 };
+
+void parse_line(const char *buf, long scores[], int *nscores)
+{
+       char stack[200] = {0};
+       int sp = 0;
+       long score = 0;
+       for (const char *p = buf; ; p++) {
+               switch (*p) {
+               case '(':
+               case '[':
+               case '{':
+               case '<':
+                       stack[sp++] = *p;
+                       break;
+               case ')':
+               case ']':
+               case '}':
+               case '>':
+                       //corrupt
+                       if (stack[--sp] != cmap[(int)*p])
+                               return;
+                       stack[sp] = '\0';
+                       break;
+               case '\0':
+               case '\n':
+                       score = 0;
+                       while (sp>0)
+                               score = score*5 + rmap[(int)stack[--sp]];
+                       scores[(*nscores)++] = score;
+                       return;
+               }
+       }
+}
+
+int longcmp(const void *l, const void *r)
+{
+       return *(const long *)l-*(const long *)r < 0 ? -1 : 1;
+}
+
+int main()
+{
+       char *buf = NULL;
+       size_t len = 0;
+       long scores[100] = {0};
+       int nscores = 0;
+       while (getline(&buf, &len, stdin) != -1)
+               parse_line(buf, scores, &nscores);
+       qsort(scores, nscores, sizeof(long), &longcmp);
+       printf("%ld\n", scores[nscores/2]);
+}