day3 - no regex

 avatar
unknown
c_cpp
5 months ago
2.5 kB
51
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