113 lines
3.5 KiB
C
113 lines
3.5 KiB
C
|
|
#include <stdio.h>
|
||
|
|
#include <stdlib.h>
|
||
|
|
#include <string.h>
|
||
|
|
|
||
|
|
#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;
|
||
|
|
}
|