aoc2024/09/part2.c
2024-12-10 10:39:35 +01:00

94 lines
2.3 KiB
C

#include "_.h"
void display(char **numbers) {
for (int i = 0; numbers[i] != NULL; i++) {
for (int j = 0; numbers[i][j] != '\0'; j++)
printf("%c", numbers[i][j]);
printf(" ");
}
printf("\n");
}
char **first_line(char *input) {
char **numbers = calloc(pow(strlen(input), 2) + 1, sizeof(char*));
int count = 0;
int id = 0;
for (int i = 0; input[i] != '\0'; i++) {
int nbr = atoi(strndup(&input[i], 1));
char *add = calloc(255, 1);
add[0] = '.';
if (i % 2 == 0)
sprintf(add, "%d", id++);
for (int j = 0; j < nbr; j++)
numbers[count++] = strdup(add);
}
//display(numbers);
return numbers;
}
char **finish(char **numbers) {
long i = 0;
long lens = strslen(numbers);
for (; i < lens - 1;) {
char *to_place[10] = { [0 ... 9] = NULL };
long j = lens - 1 - i;
for (;numbers[j][0] == '.' && j > 0; j--);
i = lens - j - 1;
int w = 0;
for (; j - w > 0 && strcmp(numbers[j], numbers[j - w]) == 0; w++) {
to_place[w] = numbers[j - w];
}
int placed = 0;
for (long k = 0; k < lens && k < j; k++) {
if (numbers[k][0] == '.') {
int y = 0;
for (; numbers[k + y] != NULL && numbers[k + y][0] == '.'; y++);
if (y < w)
continue;
placed = 1;
for (int v = 0; to_place[v] != NULL; v++) {
for (int x = 0; to_place[v][x] != '\0'; x++) {
numbers[k + v][x] = to_place[v][x];
}
}
break;
}
}
if (placed)
for (int k = 0; to_place[k] != NULL; k++)
for (int l = 0; to_place[k][l] != '\0'; l++)
to_place[k][l] = '.';
i += strslen(to_place);
}
//display(numbers);
return numbers;
}
long cal(char **numbers) {
long calc = 0;
int i = 0;
for (; numbers[i] != NULL; i++)
calc += i * atol(numbers[i]);
return calc;
}
int main(int argc, char **argv) {
if (argc != 2)
return 1;
char *input = argv[1];
char **numbers = first_line(input);
long result = cal(finish(numbers));
//display(numbers);
printf("result: %ld\n", result);
return 0;
}