diff --git a/src/gloat.gleam b/src/gloat.gleam index 04a62c1..ea64009 100644 --- a/src/gloat.gleam +++ b/src/gloat.gleam @@ -15,6 +15,7 @@ import solve_2025_07 import solve_2025_08 import solve_2025_09 import solve_2025_10 +import solve_2025_11 pub fn main() -> Nil { case argv.load().arguments { @@ -43,6 +44,8 @@ pub fn main() -> Nil { display(#(2025, 9), solve_2025_09.part_one, solve_2025_09.part_two) ["2025", "10"] -> display(#(2025, 10), solve_2025_10.part_one, solve_2025_10.part_two) + ["2025", "11"] -> + display(#(2025, 11), solve_2025_11.part_one, solve_2025_11.part_two) ["2025", _] -> io.print("No solutions for 2025") _ -> io.print("Please provide the following arguments: ") } diff --git a/src/solve_2025_11.gleam b/src/solve_2025_11.gleam new file mode 100644 index 0000000..fa82b9e --- /dev/null +++ b/src/solve_2025_11.gleam @@ -0,0 +1,49 @@ +import gleam/dict.{type Dict} +import gleam/list +import gleam/result +import gleam/set.{type Set} +import gleam/string + +pub fn part_one(input: String) -> Int { + let graph = parse(input) + + let start = graph |> dict.get("you") |> result.unwrap(set.new()) + count_paths(graph, start, "out") +} + +fn count_paths( + graph: Dict(String, Set(String)), + to_visit: Set(String), + end: String, +) { + use accumulator, node <- set.fold(to_visit, 0) + accumulator + + case node == end { + True -> 1 + False -> + count_paths( + graph, + graph |> dict.get(node) |> result.unwrap(set.new()), + end, + ) + } +} + +pub fn part_two(_input: String) -> Int { + // echo parse(input) + -1 +} + +fn parse(input: String) -> Dict(String, Set(String)) { + use graph, line <- list.fold(string.split(input, "\n"), dict.new()) + case line |> string.split_once(": ") { + Ok(#(from, to)) -> { + graph + |> dict.insert( + from, + to |> string.split(" ") |> list.map(string.trim) |> set.from_list, + ) + } + Error(_) -> graph + } +} diff --git a/test/test_2025_11.gleam b/test/test_2025_11.gleam new file mode 100644 index 0000000..8bfbb2c --- /dev/null +++ b/test/test_2025_11.gleam @@ -0,0 +1,31 @@ +import gleam/string +import solve_2025_11 + +const input = " +aaa: you hhh +you: bbb ccc +bbb: ddd eee +ccc: ddd eee fff +ddd: ggg +eee: out +fff: out +ggg: out +hhh: ccc fff iii +iii: out +" + +pub fn part_one_test() { + let result = + input + |> string.trim + |> solve_2025_11.part_one + assert result == 5 +} + +pub fn part_two_test() { + let result = + input + |> string.trim + |> solve_2025_11.part_two + assert result == -1 +}