diff options
Diffstat (limited to 'aoc2017-gleam/src/aoc_2017/day_17.gleam')
-rw-r--r-- | aoc2017-gleam/src/aoc_2017/day_17.gleam | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/aoc2017-gleam/src/aoc_2017/day_17.gleam b/aoc2017-gleam/src/aoc_2017/day_17.gleam new file mode 100644 index 0000000..5904cab --- /dev/null +++ b/aoc2017-gleam/src/aoc_2017/day_17.gleam @@ -0,0 +1,55 @@ +import gleam/int +import gleam/list +import glearray + +pub fn parse(input: String) { + let assert Ok(n) = int.parse(input) + n +} + +pub fn pt_1(input: Int) { + let assert [_, result] = + next_spin([0], 0, 1, input) + |> list.drop_while(fn(x) { x != 2017 }) + |> list.take(2) + + result +} + +fn next_spin(list: List(Int), position: Int, cycle: Int, step: Int) { + case cycle { + 2018 -> list + _ -> { + let next_position = { position + step } % cycle + 1 + next_spin( + insert_at(list, next_position, cycle), + next_position, + cycle + 1, + step, + ) + } + } +} + +fn insert_at(xs: List(a), at index: Int, insert new: a) { + let #(left, right) = list.split(xs, index) + list.concat([left, [new], right]) +} + +pub fn pt_2(input: Int) { + next_spin_tracking_zero(0, 0, 1, input) +} + +fn next_spin_tracking_zero(acc: Int, position: Int, cycle: Int, step: Int) { + case cycle { + 50_000_001 -> acc + _ -> { + let next_position = { position + step } % cycle + 1 + let next_acc = case next_position { + 1 -> cycle + _ -> acc + } + next_spin_tracking_zero(next_acc, next_position, cycle + 1, step) + } + } +} |