#include #include #define RT_CORE_IMPLEMENTATION #include "rtcore.h" #include "aoc.h" typedef struct { i64 first; i64 last; } range; int sort_range(range *a, range *b) { return a->first <= b->first ? -1 : 1; } int main(int argc, char **argv) { arena arena = CreateArena(); dataset ds = ParseDatasetOption(argc, argv); s8 input = {0}; if (ds == DS_FULL) input = ReadEntireFileS8(S8("inputs/day05_full"), &arena); else if (ds == DS_DEMO) input = ReadEntireFileS8(S8("inputs/day05_demo"), &arena); if (!input.data) return 1; range *ranges = (range *)arena.begin; isize range_count = 0; split_result line = S8Split(S8Trim(input), '\n'); while (line.first.data) { if (line.first.length == 0) { break; } split_result split = S8Split(S8Trim(line.first), '-'); s8_parse_i64_result parsed_first = S8ParseI64(split.first, 10); if (!parsed_first.ok) return 1; s8_parse_i64_result parsed_second = S8ParseI64(split.second, 10); if (!parsed_second.ok) return 1; i64 first = parsed_first.i; i64 last = parsed_second.i; ranges[range_count].first = first; ranges[range_count].last = last; ++range_count; line = S8Split(line.second, '\n'); } line = S8Split(line.second, '\n'); i32 fresh_count = 0; while (line.first.data) { s8_parse_i64_result id_ = S8ParseI64(line.first, 10); if (!id_.ok) return 1; i64 id = id_.i; for (isize i = 0; i < range_count; ++i) { if (id >= ranges[i].first && id <= ranges[i].last) { ++fresh_count; break; } } line = S8Split(line.second, '\n'); } printf("Answer: %d\n", fresh_count); qsort(ranges, range_count, sizeof(range), (__compar_fn_t)sort_range); /* Part two */ for (isize i = 0; i < range_count; ++i) { printf("%ld-%ld\n", ranges[i].first, ranges[i].last); } return 0; }