#include #include #include struct digit { char sig[10]; int digit; int unique; }; 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 int CompareLen(const void *a, const void *b) { const char const **pa = a; const char const **pb = b; int l1; int l2; l1 = strlen(*pa); l2 = strlen(*pb); return l1 - l2; } static int CalcCodes(struct digit digit[10], char *signal[10]) { qsort(signal, 10, sizeof signal[0], CompareLen); } static int GetDigit(const struct digit *digit, const char *p) { int check[10] = {0}; int f; for(f = 0; f < 10; f++) { if (strlen(digit[f].sig) == strlen(p)) { int n; check[f] = 1; if (!digit[f].unique) { for(n = 0; n < strlen(p); n++) { if(!strchr(digit[f].sig, p[n])) { check[f] = 0; } } } } } for(f = 0; f < 10; f++) { if(check[f]) { return digit[f].digit; } } printf("No digit for %s\n", p); exit(1); } int main(void) { char buff[0x8000]; char *signal[10] = {0}; char *digit[4] = {0}; struct digit dig[10]; int num = 0; int sum = 0; int f = 0; while(ReadLine(buff, sizeof buff, stdin)) { char result[5] = "0000"; for(f = 0; f < 10; f++) { signal[f] = strtok(f == 0 ? buff : NULL, " |"); } CalcCodes(dig, signal); for(f = 0; f < 4; f++) { size_t len; digit[f] = strtok(NULL, " |"); num = GetDigit(dig, digit[f]); result[f] = '0' + num; } sum += atoi(result); } printf("sum = %d\n", sum); return 0; }