diff --git a/src/gloat.gleam b/src/gloat.gleam index c1bbe38..cffdc49 100644 --- a/src/gloat.gleam +++ b/src/gloat.gleam @@ -9,6 +9,7 @@ import solve_2025_01 import solve_2025_02 import solve_2025_03 import solve_2025_04 +import solve_2025_05 pub fn main() -> Nil { case argv.load().arguments { @@ -25,6 +26,8 @@ pub fn main() -> Nil { display(#(2025, 3), solve_2025_03.part_one, solve_2025_03.part_two) ["2025", "4"] -> display(#(2025, 4), solve_2025_04.part_one, solve_2025_04.part_two) + ["2025", "5"] -> + display(#(2025, 5), solve_2025_05.part_one, solve_2025_05.part_two) ["2025", _] -> io.print("No solutions for 2025") _ -> io.print("Please provide the following arguments: ") } diff --git a/src/solve_2025_05.gleam b/src/solve_2025_05.gleam new file mode 100644 index 0000000..ce20d01 --- /dev/null +++ b/src/solve_2025_05.gleam @@ -0,0 +1,64 @@ +import gleam/int +import gleam/list +import gleam/result +import gleam/set +import gleam/string + +pub fn part_one(input: String) -> Int { + let #(ranges, ingredients) = parse(input) + use ingredient <- list.count(ingredients) + use range <- list.any(ranges) + range.from <= ingredient && ingredient <= range.to +} + +pub fn part_two(input: String) -> Int { + let #(ranges, _) = parse(input) + + // this crashes!! :( + // let ingredients = { + // use accumulator, range <- list.fold(ranges, set.new()) + // let ingredients = list.range(range.from, range.to) |> set.from_list + // // echo #(range, size) + // accumulator |> set.union(ingredients) + // } + // set.size(ingredients) + + -1 +} + +type Range { + Range(from: Int, to: Int) +} + +fn parse(input: String) -> #(List(Range), List(Int)) { + case input |> string.trim |> string.split_once("\n\n") { + Ok(#(ranges, ingredients)) -> { + let ranges = + string.split(ranges, "\n") + |> list.flat_map(fn(line) { + case + line + |> string.split_once("-") + |> result.map(fn(pair) { #(int.parse(pair.0), int.parse(pair.1)) }) + { + Ok(#(Ok(from), Ok(to))) -> { + [Range(from, to)] + } + _ -> [] + } + }) + + let ingredients = + string.split(ingredients, "\n") + |> list.flat_map(fn(line) { + case int.parse(line) { + Ok(ingredient) -> [ingredient] + _ -> [] + } + }) + + #(ranges, ingredients) + } + Error(_) -> #([], []) + } +} diff --git a/test/test_2025_05.gleam b/test/test_2025_05.gleam new file mode 100644 index 0000000..e114b56 --- /dev/null +++ b/test/test_2025_05.gleam @@ -0,0 +1,32 @@ +import gleam/string +import solve_2025_05 + +const input = " +3-5 +10-14 +16-20 +12-18 + +1 +5 +8 +11 +17 +32 +" + +pub fn part_one_test() { + let result = + input + |> string.trim + |> solve_2025_05.part_one + assert result == 3 +} + +pub fn part_two_test() { + let result = + input + |> string.trim + |> solve_2025_05.part_two + assert result == 14 +}