#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 int SyntaxError(char *p) { char c = 0; int 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) { if (c == ')') { return 3; } if (c == ']') { return 57; } if (c == '}') { return 1197; } if (c == '>') { return 25137; } printf("Unexpected character %c\n", c); } } } return 0; } int main(void) { char buff[0x8000]; int sum = 0; int score = 0; int f = 0; while(ReadLine(buff, sizeof buff, stdin)) { score = SyntaxError(buff); sum += score; } printf("sum = %d\n", sum); return 0; }