cleanup
[advent21.git] / 10b.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 char cmap[] = { [')']='(', [']']='[', ['}']='{', ['>']='<' };
5 long rmap[] = { ['(']=1, ['[']=2, ['{']=3, ['<']=4 };
6
7 void parse_line(const char *buf, long scores[], int *nscores)
8 {
9 char stack[200] = {0};
10 int sp = 0;
11 long score = 0;
12 for (const char *p = buf; ; p++) {
13 switch (*p) {
14 case '(':
15 case '[':
16 case '{':
17 case '<':
18 stack[sp++] = *p;
19 break;
20 case ')':
21 case ']':
22 case '}':
23 case '>':
24 //corrupt
25 if (stack[--sp] != cmap[(int)*p])
26 return;
27 stack[sp] = '\0';
28 break;
29 case '\0':
30 case '\n':
31 score = 0;
32 while (sp>0)
33 score = score*5 + rmap[(int)stack[--sp]];
34 scores[(*nscores)++] = score;
35 return;
36 }
37 }
38 }
39
40 int longcmp(const void *l, const void *r)
41 {
42 return *(const long *)l-*(const long *)r < 0 ? -1 : 1;
43 }
44
45 int main()
46 {
47 char *buf = NULL;
48 size_t len = 0;
49 long scores[100] = {0};
50 int nscores = 0;
51 while (getline(&buf, &len, stdin) != -1)
52 parse_line(buf, scores, &nscores);
53 qsort(scores, nscores, sizeof(long), &longcmp);
54 printf("%ld\n", scores[nscores/2]);
55 }