93 lines
1.9 KiB
C
93 lines
1.9 KiB
C
#include <limits.h>
|
|
#include <stdint.h>
|
|
#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;
|
|
}
|