aoc_omni/c/2024/3/mull_it_over.c
2024-12-27 05:38:45 -05:00

73 lines
1.3 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "../../lib/aoc.h"
enum State { M, U, L, OPEN, D1, D2 };
int main() {
int sum = 0;
int cond_sum = 0;
char d1[10], d2[10];
int d1_index, d2_index;
enum State state = M;
bool do_mult = true;
char *c = aoc_read_input();
while(*c != '\0') {
if (memcmp(c, "do()", 4) == 0) do_mult = true;
else if (memcmp(c, "don't()", 7) == 0) do_mult = false;
switch (state) {
case M:
if (*c == 'm') state = U;
break;
case U:
if (*c == 'u') state = L;
else state = M;
break;
case L:
if (*c == 'l') state = OPEN;
else state = M;
break;
case OPEN:
d1_index = 0;
d2_index = 0;
if (*c == '(') state = D1;
else state = M;
break;
case D1:
if (*c >= '0' && *c <= '9') {
d1[d1_index++] = *c;
}
else if(*c == ',') state = D2;
else state = M;
break;
case D2:
if (*c >= '0' && *c <= '9') {
d2[d2_index++] = *c;
}
else if(*c == ')') {
d1[d1_index] = '\0';
d2[d2_index] = '\0';
sum += atoi(d1) * atoi(d2);
if (do_mult) cond_sum += atoi(d1) * atoi(d2);
state = M;
}
else state = M;
break;
}
c++;
}
printf("Part 1: %d\n", sum);
printf("Part 2: %d\n", cond_sum);
aoc_free();
return 0;
}