day3 - no regex
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