From f356385e661269d3ce21986bb058883596ac388d Mon Sep 17 00:00:00 2001 From: HJ Date: Sat, 15 Jun 2024 00:42:44 -0400 Subject: day 12 complete --- aoc2017-gleam/src/aoc_2017/day_11.gleam | 7 ------ aoc2017-gleam/src/aoc_2017/day_12.gleam | 44 +++++++++++++++++++++++++++++++++ aoc2017-gleam/src/aoc_2017/day_13.gleam | 7 ++++++ 3 files changed, 51 insertions(+), 7 deletions(-) delete mode 100644 aoc2017-gleam/src/aoc_2017/day_11.gleam create mode 100644 aoc2017-gleam/src/aoc_2017/day_12.gleam create mode 100644 aoc2017-gleam/src/aoc_2017/day_13.gleam diff --git a/aoc2017-gleam/src/aoc_2017/day_11.gleam b/aoc2017-gleam/src/aoc_2017/day_11.gleam deleted file mode 100644 index a0a1145..0000000 --- a/aoc2017-gleam/src/aoc_2017/day_11.gleam +++ /dev/null @@ -1,7 +0,0 @@ -pub fn pt_1(input: String) { - todo as "part 1 not implemented" -} - -pub fn pt_2(input: String) { - todo as "part 2 not implemented" -} diff --git a/aoc2017-gleam/src/aoc_2017/day_12.gleam b/aoc2017-gleam/src/aoc_2017/day_12.gleam new file mode 100644 index 0000000..a9d73c5 --- /dev/null +++ b/aoc2017-gleam/src/aoc_2017/day_12.gleam @@ -0,0 +1,44 @@ +import gleam/dict +import gleam/list +import gleam/set.{type Set} +import gleam/string + +type Pipes = + dict.Dict(String, List(String)) + +pub fn parse(input: String) -> Pipes { + use acc, row <- list.fold(string.split(input, "\n"), dict.new()) + let assert Ok(#(from, to)) = string.split_once(row, " <-> ") + let to_nodes = string.split(to, ", ") + dict.insert(acc, from, to_nodes) +} + +pub fn pt_1(input: Pipes) { + next_nodes("0", input, set.new()) |> set.size() +} + +pub fn pt_2(input: Pipes) { + count_groups(dict.keys(input), input, 0) +} + +fn next_nodes(current: String, pipes: Pipes, found: Set(String)) { + let assert Ok(to_nodes) = dict.get(pipes, current) + + use acc, node <- list.fold(to_nodes, found) + case set.contains(found, node) { + False -> acc |> set.insert(node) |> next_nodes(node, pipes, _) + True -> acc + } +} + +fn count_groups(all_nodes: List(String), pipes: Pipes, count: Int) { + case all_nodes { + [] -> count + [first, ..] -> { + let next_subgraph = next_nodes(first, pipes, set.new()) + let remaining = + list.filter(all_nodes, fn(n) { !set.contains(next_subgraph, n) }) + count_groups(remaining, pipes, count + 1) + } + } +} diff --git a/aoc2017-gleam/src/aoc_2017/day_13.gleam b/aoc2017-gleam/src/aoc_2017/day_13.gleam new file mode 100644 index 0000000..a0a1145 --- /dev/null +++ b/aoc2017-gleam/src/aoc_2017/day_13.gleam @@ -0,0 +1,7 @@ +pub fn pt_1(input: String) { + todo as "part 1 not implemented" +} + +pub fn pt_2(input: String) { + todo as "part 2 not implemented" +} -- cgit v1.2.3