#include #include #include #define MAX_STACK 1024 typedef struct { char data[MAX_STACK]; int sp; } stack; static char *ReadLine(char *p, size_t size, FILE *fp) { if ((p=fgets(p, size, fp))) { size_t l = strlen(p); while(l && p[l-1] == '\n') { p[--l] = 0; } } return p; } static char AnyOpen(int c) { switch(c) { case '(': return 1; case '[': return 1; case '{': return 1; case '<': return 1; default: return 0; } } static char AnyClose(int c) { switch(c) { case ')': return 1; case ']': return 1; case '}': return 1; case '>': return 1; default: return 0; } } static char Close(int fromopen) { switch(fromopen) { case '(': return ')'; case '[': return ']'; case '{': return '}'; case '<': return '>'; default: return 0; } } static void Push(stack *s, char c) { if (s->sp == MAX_STACK) { printf("Stack too big!\n"); exit(1); } s->data[s->sp++] = c; } static char Pop(stack *s) { if (s->sp == 0) { printf("Stack too small!\n"); exit(1); } return s->data[--s->sp]; } static long CompleteLine(char *p) { char c = 0; long score = 0; stack s = {0}; while((c = *p++)) { if (AnyOpen(c)) { Push(&s, c); } if (AnyClose(c)) { char close = Close(Pop(&s)); if (close != c) { return 0; } } } while(s.sp) { char close = Close(Pop(&s)); score *= 5; switch(close) { case ')': score += 1; break; case ']': score += 2; break; case '}': score += 3; break; case '>': score += 4; break; } } return score; } static int Compare(const void *a, const void *b) { const long *pa = a; const long *pb = b; if (*pa == *pb) { return 0; } else if (*pa < *pb) { return -1; } else { return 1; } } int main(void) { char buff[0x8000]; long score[1204] = {0}; int num_score = 0; long f = 0; while(ReadLine(buff, sizeof buff, stdin)) { f = CompleteLine(buff); if (f) { score[num_score++] = f; } } qsort(score, num_score, sizeof score[0], Compare); printf("middle = %ld\n", score[num_score / 2]); return 0; }