day3 - no regex
unknown
c_cpp
a year ago
2.5 kB
56
Indexable
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int parse_number_until_char(char* s, char** end, char limit, int* a) {
char* n_start = &s[0];
char* n_end = n_start;
while (*n_end >= '0' && *n_end <= '9') n_end++;
*end = n_end;
if (n_start == n_end) return 1;
if (*n_end != limit) return 2;
char* found_end;
*a = strtol(n_start, &found_end, 10);
if (found_end != n_end) {
printf("WHAT THE HELL\n");
}
return 0;
}
int parse_strict_tuple(char* s, char** end, int* a, int* b) {
if (s[0] != '(') {
printf("%s\n",s);
printf("FATAL: string does not even start with parenthesis\n");
*end = s + 1;
return 1;
}
if(parse_number_until_char(&s[1], end, ',', a)) {
return 2;
}
s = *end +1;
if(parse_number_until_char(&s[0], end, ')', b)) {
return 2;
}
return 0;
}
int find_next_mul_or_do_dont(char** idx) {
char* next_mul = strstr(*idx, "mul(");
char* next_do = strstr(*idx, "do()");
char* next_dont = strstr(*idx, "don't()");
if (
((next_mul < next_do) || next_do == 0) &&
((next_mul < next_dont) || next_dont == 0) &&
next_mul != 0
) {
*idx = next_mul + 3;
return 1;
}
if (((next_do < next_dont) || next_dont == 0) && next_do != 0) {
*idx = next_do + 3;
return 2;
}
if (next_dont != 0) {
*idx = next_dont + 6;
return 3;
}
return 0;
}
void solve_partial(char* line, int* enabled, int* acc1, int* acc2) {
char* idx = line;
int result = 0;
while((result = find_next_mul_or_do_dont(&idx)) != 0) {
if (result == 2) {
*enabled = 1;
continue;
}
if (result == 3) {
*enabled = 0;
continue;
}
int a,b;
char* next;
if (parse_strict_tuple(idx, &next, &a, &b)) {
idx = next;
continue;
}
idx = next;
*acc1 += a * b;
if(*enabled)
*acc2 += a * b;
}
}
int solve() {
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
fp = fopen("input_3.txt", "r");
if (fp == NULL)
exit(EXIT_FAILURE);
int acc1 = 0;
int acc2 = 0;
int enabled = 1;
while ((read = getline(&line, &len, fp)) != -1) {
solve_partial(line, &enabled, &acc1, &acc2);
}
printf("1 => %d\n2 => %d\n", acc1, acc2);
}
int main() {
solve();
return 0;
}Editor is loading...
Leave a Comment