diff --git a/day4.c b/day4.c new file mode 100644 index 0000000..867b04e --- /dev/null +++ b/day4.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include + +#include "aoc.h" + +typedef struct { + int from, to; +} Range; + +typedef struct { + Range first; + Range second; +} DoubleRange; + +typedef struct { + DoubleRange *ranges; + size_t count; +} day4_Data; + +static inline void day4_parse_range(Range *range, char *s) +{ + range->from = atoi(strsep(&s, "-")); + range->to = atoi(strsep(&s, "-")); +} + +static void day4_parse_line(DoubleRange *double_range, char *line) +{ + char *line_copy = strdup(line); + char *line_copy_start = line_copy; + day4_parse_range(&double_range->first, strsep(&line_copy, ",")); + day4_parse_range(&double_range->second, strsep(&line_copy, ",")); + free(line_copy_start); +} + +static void *day4_parse(char **lines, int line_count) +{ + day4_Data *data = calloc(1, sizeof(day4_Data)); + DoubleRange *ranges = calloc(line_count, sizeof(DoubleRange)); + data->ranges = ranges; + data->count = line_count; + for (size_t i = 0; i < line_count; i++) { + day4_parse_line(&data->ranges[i], lines[i]); + } + return data; +} + +static int day4_part1(void *p) +{ + day4_Data *data = (day4_Data*)p; + int result = 0; + for (int i = 0; i < data->count; i++) { + Range *range1 = &data->ranges[i].first; + Range *range2 = &data->ranges[i].second; + if ((range1->from <= range2->from && range1->to >= range2->to) || + (range2->from <= range1->from && range2->to >= range1->to)) { + result++; + } + } + return result; +} + +static int day4_part2(void *p) +{ + day4_Data *data = (day4_Data*)p; + int result = 0; + for (int i = 0; i < data->count; i++) { + Range *range1 = &data->ranges[i].first; + Range *range2 = &data->ranges[i].second; + if ((range1->from <= range2->from && range1->to >= range2->to) || + (range2->from <= range1->from && range2->to >= range1->to) || + MIN(range1->to, range2->to) >= MAX(range1->from, range2->from)) { + result++; + } + } + return result; +} + + +ADD_SOLUTION(4, day4_parse, day4_part1, day4_part2); diff --git a/main.c b/main.c index 2d385ac..26d7a56 100644 --- a/main.c +++ b/main.c @@ -11,6 +11,7 @@ #include "day1.c" #include "day2.c" #include "day3.c" +#include "day4.c" Solution *find_solution(int day) {