bjorng

bjorng

Erlang Core Team

Note: This topic is to talk about Day 6 of the Advent of Code 2019.

There is a private leaderboard for elixirforum members. You can join it by following this link and entering the following code:

39276-eeb74f9a

Showing Posts 1 to 10

bjorng

bjorng OP

Erlang Core Team

Here is my solution.

sb8244

sb8244

Author of Real-Time Phoenix

Wait, digraph has the full answer in it??? Good to know for the future. I like your pt1 solution too.

My Solution ended up doing DFS/BFS manually. I got tripped up a bit by trying to do BFS without an Enumeration, and then I remembered that is a real hassle and that Enum.map would work great.

Aetherus

Aetherus

My Part 1 solution using :digraph. Deadly slow:

graph = :digraph.new([:acyclic, :private])

edges = File.stream!("./day06-input.txt")
        |> Enum.map(fn line -> line |> String.trim() |> String.split(")") end)

vertices = edges
           |> List.flatten()
           |> MapSet.new()

Enum.each(vertices, fn v -> :digraph.add_vertex(graph, v) end)

Enum.each(edges, fn [v1, v2] -> :digraph.add_edge(graph, v1, v2) end)

vertices
|> Stream.map(fn vertex -> :digraph.get_path(graph, "COM", vertex) end)
|> Stream.filter(& &1)
|> Stream.map(fn path -> length(path) - 1 end)
|> Enum.sum()
|> IO.inspect()

UPDATE part 2 solution

graph = :digraph.new([:cyclic, :private])

edges = File.stream!("./day06-input.txt")
        |> Enum.map(fn line -> line |> String.trim() |> String.split(")") end)

vertices = edges
           |> List.flatten()
           |> MapSet.new()

Enum.each(vertices, fn v -> :digraph.add_vertex(graph, v) end)

Enum.each(edges, fn [v1, v2] ->
  :digraph.add_edge(graph, v1, v2)
  :digraph.add_edge(graph, v2, v1)
end)

path = :digraph.get_short_path(graph, "YOU", "SAN")

IO.inspect(length(path) - 3)

Note that the graph needs to be bidirectional and thus cyclic, so I just added 2 edges for each pair of vertices, in opposite directions.

bjorng

bjorng OP

Erlang Core Team

Part 1 will be much faster if you reverse the direction of the edges. That is, add the edges like this:

Enum.each(edges, fn [v1, v2] -> :digraph.add_edge(graph, v2, v1) end)

and search for the path like this:

|> Stream.map(fn vertex -> :digraph.get_path(graph, vertex, "COM") end)
Aetherus

Aetherus

Indeed! Thank you @bjorng. I guess it’s because there is no need to search a path from a child node to a parent node, but not the other way around.

sasajuric

sasajuric

Author of Elixir In Action

Here’s my solution, also powered by digraph.

For the fun of it, I also implemented a pure functional version.

aaronnamba

aaronnamba

My day 6 solution, not powered by :digraph, which I am going to go look up right now. :sweat_smile:

At first, I was duped by the example into thinking they were going to give me a nicely ordered input set. That was silly, and cost me quite a bit of time.

xfix

xfix

I made a solution without :digraph because I had no idea it existed. And I suppose because what’s the point of using a functional programming language if you are going to use shared mutable data structures.

NobbZ

NobbZ

This was a quick one, though I lost about an hour reading into dijkstra algorithm for pathfinding again and trying to implement it, before just resorting into :digraph for part 2.

milli

milli

My solution, no digraph :wink:

Where Next? Top

Trending in Challenges Top

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews