#include #include #include #define LINE_MAX_LENGTH 32*1024 #define STRBUF_SIZE 64 #define NUM_BOXES 256 #define MAX_LENS_PER_BOX 32 #define NUM_0_CHARCODE 48 typedef struct lens { char label[STRBUF_SIZE]; int label_len; int focal_length; } lens_t; typedef struct box { lens_t lenses[MAX_LENS_PER_BOX]; int lenses_num; } box_t; int hash(char*, int); int main() { char *p, *buf, c, *start; buf = (char *)malloc(LINE_MAX_LENGTH); memset(buf, 0, LINE_MAX_LENGTH); p = buf; char strbuf[STRBUF_SIZE]; memset(strbuf, 0, STRBUF_SIZE * sizeof(char)); box_t boxes[NUM_BOXES]; memset(boxes, 0, NUM_BOXES * sizeof(box_t)); int sum = 0; while ((c = getchar()) != EOF) { *p++ = c; if (c == '\n') { p = buf; start = p; while (*p != '\0') { while (*p != ',' && *p != '\n') p++; strncpy(strbuf, start, p - start); sum += hash(strbuf, p - start); // Find = or - while (*p != '-' && *p != '=') p--; int box_num = hash(strbuf, p - start); if (*p == '-') { for (int i = 0; i < boxes[box_num].lenses_num; i++) { if (boxes[box_num].lenses[i].label_len == p - start && !strncmp(boxes[box_num].lenses[i].label, strbuf, p - start)) { for (int j = i; j < boxes[box_num].lenses_num - 1; j++) { memcpy(&boxes[box_num].lenses[j], &boxes[box_num].lenses[j + 1], sizeof(lens_t)); } boxes[box_num].lenses_num--; break; } } p++; } else if (*p == '=') { int found = 0; int focal_length = *(p+1) - NUM_0_CHARCODE; for (int i = 0; i < boxes[box_num].lenses_num; i++) { if (boxes[box_num].lenses[i].label_len == p - start && !strncmp(boxes[box_num].lenses[i].label, strbuf, p - start)) { boxes[box_num].lenses[i].focal_length = focal_length; found = 1; break; } } if (!found) { boxes[box_num].lenses[boxes[box_num].lenses_num].label_len = p - start; boxes[box_num].lenses[boxes[box_num].lenses_num].focal_length = focal_length; strncpy(boxes[box_num].lenses[boxes[box_num].lenses_num].label, strbuf, p - start); boxes[box_num].lenses_num++; } p++; p++; } p++; start = p; memset(strbuf, 0, STRBUF_SIZE * sizeof(char)); } memset(buf, 0, LINE_MAX_LENGTH); p = buf; } } int part2 = 0; for (int i = 0; i < NUM_BOXES; i++) { for (int j = 0; j < boxes[i].lenses_num; j++) { part2 += (i+1) * (j+1) * boxes[i].lenses[j].focal_length; } } printf("%i\n", sum); printf("%i\n", part2); free(buf); } int hash(char *str, int len) { int current_value = 0; for (int i = 0; i < len; i++) { current_value += str[i]; current_value *= 17; current_value %= 256; } return current_value; }