This commit is contained in:
dobiadi
2023-12-19 14:19:57 +01:00
parent 8741d0d456
commit fe918ad8e3
4 changed files with 114 additions and 0 deletions

BIN
day15/c/day15 Executable file
View File

Binary file not shown.

112
day15/c/day15.c Normal file
View File

@@ -0,0 +1,112 @@
#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;
}

1
day15/input.txt Normal file
View File

File diff suppressed because one or more lines are too long

1
day15/sample.txt Normal file
View File

@@ -0,0 +1 @@
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7