aboutsummaryrefslogtreecommitdiff
path: root/aoc2017-gleam/src/aoc_2017/day_5.gleam
diff options
context:
space:
mode:
Diffstat (limited to 'aoc2017-gleam/src/aoc_2017/day_5.gleam')
-rw-r--r--aoc2017-gleam/src/aoc_2017/day_5.gleam48
1 files changed, 48 insertions, 0 deletions
diff --git a/aoc2017-gleam/src/aoc_2017/day_5.gleam b/aoc2017-gleam/src/aoc_2017/day_5.gleam
new file mode 100644
index 0000000..a0b9b80
--- /dev/null
+++ b/aoc2017-gleam/src/aoc_2017/day_5.gleam
@@ -0,0 +1,48 @@
+import gary.{type ErlangArray}
+import gary/array
+import gleam/int
+import gleam/list
+import gleam/result
+import gleam/string
+
+pub fn parse(input: String) -> ErlangArray(Int) {
+ input
+ |> string.split("\n")
+ |> list.map(int.parse)
+ |> result.values()
+ |> array.from_list(default: 0)
+ |> array.make_fixed()
+}
+
+pub fn pt_1(input: ErlangArray(Int)) {
+ next_step(input, 0, 0, part: 1)
+}
+
+pub fn pt_2(input: ErlangArray(Int)) {
+ next_step(input, 0, 0, part: 2)
+}
+
+fn next_step(
+ instructions: ErlangArray(Int),
+ pointer: Int,
+ step: Int,
+ part part: Int,
+) {
+ case array.get(from: instructions, at: pointer) {
+ Ok(distance) -> {
+ let delta = delta(distance, part)
+ let assert Ok(updated_instructions) =
+ array.set(instructions, at: pointer, put: distance + delta)
+ next_step(updated_instructions, pointer + distance, step + 1, part)
+ }
+ Error(_) -> step
+ }
+}
+
+fn delta(d: Int, part: Int) {
+ case part, d {
+ 1, _ -> 1
+ _, n if n < 3 -> 1
+ _, _ -> -1
+ }
+}