--- /dev/null
+#include_file "core/std/wasi"
+
+use package core
+use package core.str.reader as reader
+
+count_ending_paths :: proc (nums: [..] u32) -> u64 {
+ tally: [..] u64;
+ array.init(^tally, nums.count);
+ defer array.free(^tally);
+
+ for ^t: tally do *t = 0;
+ tally[nums.count - 1] = 1;
+
+ while i := cast(i32) (nums.count - 2); i >= 0 {
+ for diff: 1 .. 4 {
+ if i + diff >= nums.count do continue;
+
+ if nums[i + diff] - nums[i] <= 3 do tally[i] += tally[i + diff];
+ }
+
+ i -= 1;
+ }
+
+ return tally[0];
+}
+
+main :: proc (args: [] cstring) {
+ contents := file.get_contents("input/day10.txt");
+ defer cfree(contents.data);
+
+ file := reader.make(contents);
+
+ nums: [..] u32;
+ array.init(^nums);
+ defer array.free(^nums);
+
+ while !reader.empty(^file) {
+ array.push(^nums, reader.read_u32(^file));
+ reader.advance_line(^file);
+ }
+
+ // Slight hack, but having 0 in the array makes both parts easier
+ array.push(^nums, 0);
+
+ array.sort(^nums, cmp_asc);
+
+ diffs: [3] u32;
+ for ^d: diffs do *d = 0;
+ for i: 1 .. nums.count do diffs[nums[i] - nums[i - 1] - 1] += 1;
+ diffs[2] += 1;
+
+ printf("Diff prod: %i\n", diffs[0] * diffs[2]);
+ printf("Arrangements: %l\n", count_ending_paths(nums));
+}