day 02
This commit is contained in:
parent
6da686c288
commit
2c61a3487c
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,61 @@
|
||||||
|
#include "aoc.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
i32 *data;
|
||||||
|
isize len, cap;
|
||||||
|
} Ints;
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_safe(i32 *nums, isize len) {
|
||||||
|
bool expect_increase = nums[1] > nums[0];
|
||||||
|
for (isize i = 0; i < len - 1; i++) {
|
||||||
|
i32 a = nums[i], b = nums[i + 1];
|
||||||
|
i32 diff = b - a;
|
||||||
|
if (expect_increase) {
|
||||||
|
if (diff < 0) return false;
|
||||||
|
if (diff > 3) return false;
|
||||||
|
if (diff < 1) return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (diff > 0) return false;
|
||||||
|
if (diff < -3) return false;
|
||||||
|
if (diff > -1) return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_safe_with_exception(i32 *nums, i32 len, Arena temp) {
|
||||||
|
i32 *selection = ARENA_ALLOC_ARRAY(&temp, i32, len - 1);
|
||||||
|
for (isize skip = 0; skip < len; skip++) {
|
||||||
|
memcpy(selection, nums, skip * sizeof(i32));
|
||||||
|
memcpy(selection + skip, nums + skip + 1, (len - skip - 1) * sizeof(i32));
|
||||||
|
if (is_safe(selection, len - 1)) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
Arena *arena = make_arena(Megabytes(1));
|
||||||
|
Tokens lines = read_lines(arena, argv[1]);
|
||||||
|
|
||||||
|
i32 part_1 = 0;
|
||||||
|
i32 part_2 = 0;
|
||||||
|
|
||||||
|
for (isize i = 0; i < lines.len; i++) {
|
||||||
|
str line = lines.tokens[i];
|
||||||
|
Ints values = {0};
|
||||||
|
Tokens nums = str_tokenize(arena, line, STR(" "));
|
||||||
|
for (isize j = 0; j < nums.len; j++) {
|
||||||
|
*push(&values, arena) = parse_i64(str_trim(nums.tokens[j]), *arena);
|
||||||
|
}
|
||||||
|
part_1 += is_safe(values.data, values.len);
|
||||||
|
part_2 += is_safe_with_exception(values.data, values.len, *arena);
|
||||||
|
}
|
||||||
|
printf("%d\n", part_1);
|
||||||
|
ASSERT(part_1 == 411);
|
||||||
|
|
||||||
|
printf("%d\n", part_2);
|
||||||
|
ASSERT(part_2 == 465);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
7 6 4 2 1
|
||||||
|
1 2 7 8 9
|
||||||
|
9 7 6 2 1
|
||||||
|
1 3 2 4 5
|
||||||
|
8 6 4 4 1
|
||||||
|
1 3 6 7 9
|
||||||
Loading…
Reference in New Issue