diff options
author | HJ <thechairman@thechairman.info> | 2024-06-15 00:42:44 -0400 |
---|---|---|
committer | HJ <thechairman@thechairman.info> | 2024-06-15 00:42:44 -0400 |
commit | f356385e661269d3ce21986bb058883596ac388d (patch) | |
tree | 8af8e97e1df616a817c317d374a1ba0141ca2fd5 | |
parent | b338ab2601f7fb10a3500a0bf8e5ba53c1f228e9 (diff) | |
download | gleam_aoc-f356385e661269d3ce21986bb058883596ac388d.tar.gz gleam_aoc-f356385e661269d3ce21986bb058883596ac388d.zip |
day 12 complete
-rw-r--r-- | aoc2017-gleam/src/aoc_2017/day_12.gleam | 44 | ||||
-rw-r--r-- | aoc2017-gleam/src/aoc_2017/day_13.gleam (renamed from aoc2017-gleam/src/aoc_2017/day_11.gleam) | 0 |
2 files changed, 44 insertions, 0 deletions
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_11.gleam b/aoc2017-gleam/src/aoc_2017/day_13.gleam index a0a1145..a0a1145 100644 --- a/aoc2017-gleam/src/aoc_2017/day_11.gleam +++ b/aoc2017-gleam/src/aoc_2017/day_13.gleam |