DEV Community

Discussion on: Advent of Code 2020 Solution Megathread - Day 10: Adapter Array

Collapse
 
_bigblind profile image
Frederik 👨‍💻➡️🌐 Creemers

My Elixir solution:

defmodule Adapters do
  def getSortedAdapters() do
    {:ok, text} = File.read("10.txt")
    lines = String.split(text, "\n")
    lines = List.delete_at(lines, length(lines)-1) # remove empty line
    joltages = Enum.map(lines, &String.to_integer/1)
    Enum.sort(joltages)
  end

  def round1() do
    adapters = getSortedAdapters()
    {ones, threes, _prev} = Enum.reduce(adapters, {0, 0, 0}, fn (x, {ones, threes, prev}) ->
      cond do
        (x - prev) == 1 ->
          {ones + 1, threes, x}
        (x - prev) == 3 ->
          {ones, threes + 1, x}
        true ->
          {ones, threes, x}
      end
    end)
    threes = threes + 1 # hop from the last adapter to the built-in one
    IO.puts("#{ones} * #{threes} = #{ones * threes}")
  end

  def count_connections_upto(current, sofar) do
    IO.puts(current)
    sofar
      |> Enum.take_while(fn {adapter, _ways} -> adapter >= (current - 3) end)
      |> Enum.map(fn {_adapter, ways} -> ways end )
      |> Enum.sum()
  end

  def count_connections(adapters, sofar) do
    [current | remaining] = adapters

    n = count_connections_upto(current, sofar)
    if length(remaining) > 0 do
      count_connections(remaining, [{current, n} | sofar])
    else
      n
    end
  end

  def round2() do
    adapters = getSortedAdapters()
    IO.puts(count_connections(adapters, [{0, 1}]))
  end
end

Adapters.round2()
Enter fullscreen mode Exit fullscreen mode