Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day - 14

day-14.livemd

Day - 14

Setup

Mix.install([
  {:kino, "~> 0.4.1"}
])
input = Kino.Input.textarea("Please enter your Input")
[template | lines] =
  input
  |> Kino.Input.read()
  |> String.split(["\n"], trim: true)

template =
  template
  |> String.to_charlist()
  |> Enum.chunk_every(2, 1, [0])
  |> Enum.frequencies()

pairs = Map.new(lines, fn < ", o>> -> {[i1, i2], o} end)

:ok

Part 1

{{_, mins}, {_, maxes}} =
  1..10
  |> Enum.reduce(template, fn _, template ->
    Enum.reduce(template, %{}, fn {[i1, i2] = pair, count}, acc ->
      case pairs do
        %{^pair => o} ->
          acc
          |> Map.update([i1, o], count, &amp;(&amp;1 + count))
          |> Map.update([o, i2], count, &amp;(&amp;1 + count))

        %{} ->
          Map.put(acc, pair, count)
      end
    end)
  end)
  |> Enum.group_by(&amp;hd(elem(&amp;1, 0)), &amp;elem(&amp;1, 1))
  |> Enum.min_max_by(fn {_, counts} -> Enum.sum(counts) end)

Enum.sum(maxes) - Enum.sum(mins)

Part 2

{{_, mins}, {_, maxes}} =
  1..40
  |> Enum.reduce(template, fn _, template ->
    Enum.reduce(template, %{}, fn {[i1, i2] = pair, count}, acc ->
      case pairs do
        %{^pair => o} ->
          acc
          |> Map.update([i1, o], count, &amp;(&amp;1 + count))
          |> Map.update([o, i2], count, &amp;(&amp;1 + count))

        %{} ->
          Map.put(acc, pair, count)
      end
    end)
  end)
  |> Enum.group_by(&amp;hd(elem(&amp;1, 0)), &amp;elem(&amp;1, 1))
  |> Enum.min_max_by(fn {_, counts} -> Enum.sum(counts) end)

Enum.sum(maxes) - Enum.sum(mins)