diff options
Diffstat (limited to 'aoc-2020-gleam/src/days/day08.gleam')
-rw-r--r-- | aoc-2020-gleam/src/days/day08.gleam | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/aoc-2020-gleam/src/days/day08.gleam b/aoc-2020-gleam/src/days/day08.gleam index 6f074cf..9ef430b 100644 --- a/aoc-2020-gleam/src/days/day08.gleam +++ b/aoc-2020-gleam/src/days/day08.gleam @@ -1,5 +1,7 @@ import gleam/io +import gleam/int import gleam/list +import gleam/bool import gleam/set.{Set} import gleam/iterator.{Iterator} as iter import gleam/option.{None, Option, Some} as opt @@ -35,7 +37,7 @@ fn parse_program(lines: List(String)) -> Program { p.replace(p.literal("-"), with: -1), ]) |> p.then(p.int()) - |> p.map2(with: fn(sign, magnitude) { sign * magnitude }) + |> p.map2(with: int.multiply) let instr_parser = p.any(of: [ @@ -77,10 +79,14 @@ fn execution_result_helper( cpu: Cpu, visited: Set(Int), ) -> ExecutionResult { - case set.contains(visited, cpu.pc), fetch(from: program, with: cpu) { - True, _ -> InfiniteLoop(acc_before_second: cpu.acc) - _, None -> Termination(acc_after: cpu.acc) - _, Some(instr) -> + use <- bool.guard( + when: set.contains(visited, cpu.pc), + return: InfiniteLoop(acc_before_second: cpu.acc), + ) + + case fetch(from: program, with: cpu) { + None -> Termination(acc_after: cpu.acc) + Some(instr) -> execution_result_helper( program, execute(instr, on: cpu), |