AoC2024/11/mainB.c
2024-12-12 15:41:01 +01:00

117 lines
2.3 KiB
C

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
struct list {
unsigned long int num;
unsigned long int solution;
int i;
struct list *next;
};
struct pair {
unsigned long int a;
unsigned long int b;
};
struct list *solutions;
struct list *current;
bool even_digits(unsigned long int x)
{
int i = 0;
while (x /= 10)
i++;
return i % 2;
}
// power! x to the y!
int pow(int x, int y)
{
int ans = 1;
for (int i = 0; i < y; i++) ans *= x;
return ans;
}
void split_stone(unsigned long int stone, struct pair *pair) {
int digits = 1;
unsigned long int x = stone;
while (x /= 10)
digits++;
unsigned long int a = stone;
int b = 0;
for (int i = 0; i < digits / 2; i++) {
b += (a % 10) * pow(10, i);
a /= 10;
}
pair->a = a;
pair->b = b;
}
unsigned long int solve_stone(unsigned long int stone, int i)
{
i--;
if (i == 0)
return 1;
// check / add to solved list
current = solutions;
while (current->next && !(current->num == stone && current->i == i)) {
current = current->next;
}
if (current->num == stone && current->i == i) {
printf("ay found repetition\n");
return current->solution;
}
int sum = 0;
// if not solved, split / multiply / set to 1 and send to solve
// 0 => make 1
if (stone == 0)
sum = solve_stone(1, i);
// even number of digits => split, fix list shit
else if (even_digits(stone)) {
struct pair *pair = malloc(sizeof(struct pair));
split_stone(stone, pair);
sum += solve_stone(pair->a, i);
sum += solve_stone(pair->b, i);
free(pair);
}
// (point first split onto second split, second split onto old ptr)
// else => mult 2024
else
sum = solve_stone(stone * 2024, i);
while (current->next && current->num != -1) {}
current->next = malloc(sizeof(struct list));
current = current->next;
current->num = stone;
current->i = i;
current->solution = sum;
return sum;
}
int main ()
{
// figure out data dimensions
FILE *input = fopen("./input", "r");
unsigned int tmp;
unsigned int array[10];
for (int i = 0; i < 10; i++)
array[i] = -1;
for (int i = 0; fscanf(input, "%d", &tmp) == 1; i++) {
array[i] = tmp;
}
fclose(input);
solutions = malloc(sizeof(struct list));
solutions->num = -1;
solutions->next = NULL;
unsigned long int sum = 0;
for (int i = 0; array[i] != -1; i++) {
sum += solve_stone(array[i], 6);
}
printf("total: %d\n", sum);
}