diff options
author | HJ <thechairman@thechairman.info> | 2023-12-13 20:33:34 -0500 |
---|---|---|
committer | HJ <thechairman@thechairman.info> | 2023-12-13 20:33:34 -0500 |
commit | 27d3a02a88826e51842b162b9a9d0bb621c72db8 (patch) | |
tree | ee79796e7ea9d3a7d9e3670f7bb9b051cedb7b21 /aoc2023/src/day13 | |
parent | a3edcaeaf4395b95ff5b21238e5fd2e45a5f14a4 (diff) | |
download | gleam_aoc-27d3a02a88826e51842b162b9a9d0bb621c72db8.tar.gz gleam_aoc-27d3a02a88826e51842b162b9a9d0bb621c72db8.zip |
day 13 revisions
Diffstat (limited to 'aoc2023/src/day13')
-rw-r--r-- | aoc2023/src/day13/solve.gleam | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/aoc2023/src/day13/solve.gleam b/aoc2023/src/day13/solve.gleam index a597074..2b3fca2 100644 --- a/aoc2023/src/day13/solve.gleam +++ b/aoc2023/src/day13/solve.gleam @@ -2,40 +2,43 @@ import adglent.{First, Second} import gleam/io import gleam/list import gleam/string -import gleam/result +import gleam/bool type SymmetryType { Horizontal(Int) Vertical(Int) } -fn is_symmetric(xs: List(List(a)), errors: Int, index: Int) -> Result(Int, Nil) { - case list.split(xs, index) { - #(_, []) -> Error(Nil) - #(ls, rs) -> { - let zipped = list.zip(list.flatten(list.reverse(ls)), list.flatten(rs)) - let found_errors = - zipped - |> list.filter(fn(tup) { tup.1 != tup.0 }) - |> list.length - case found_errors == errors { - True -> Ok(index) - False -> is_symmetric(xs, errors, index + 1) - } - } +fn is_symmetric(xss: List(List(a)), errs: Int) { + let assert [left, ..right] = xss + do_is_symmetric([left], right, errs) +} + +fn do_is_symmetric( + left: List(List(a)), + right: List(List(a)), + errors: Int, +) -> Result(Int, Nil) { + use <- bool.guard(list.is_empty(right), Error(Nil)) + let assert [h, ..t] = right + let found_errors = + list.zip(list.flatten(left), list.flatten(right)) + |> list.filter(fn(tup) { tup.1 != tup.0 }) + |> list.length + case found_errors == errors { + True -> Ok(list.length(left)) + False -> do_is_symmetric([h, ..left], t, errors) } } -fn get_symmetry_type(xs: List(List(String)), errors: Int) { - result.or( - xs - |> is_symmetric(errors, 1) - |> result.map(Horizontal(_)), - xs - |> list.transpose() - |> is_symmetric(errors, 1) - |> result.map(Vertical(_)), - ) +fn get_symmetry_type(xss: List(List(String)), errors: Int) { + case is_symmetric(xss, errors) { + Ok(n) -> Horizontal(n) + _ -> { + let assert Ok(n) = is_symmetric(list.transpose(xss), errors) + Vertical(n) + } + } } fn summarize_notes(symmetries: List(SymmetryType)) { @@ -55,7 +58,6 @@ fn solve(input: String, errors: Int) { |> list.map(string.to_graphemes) |> get_symmetry_type(errors) }) - |> result.values |> summarize_notes |> string.inspect } |