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

Day3

2021/day3.livemd

Day3

Untitled

data =
  "input"
  |> IO.getn(1_000_000)
  |> String.split(["\r\n", "\n"], trim: true)
  |> Enum.map(fn line ->
    line
    |> String.split("", trim: true)
    |> Enum.map(fn b -> String.to_integer(b) end)
  end)
defmodule P1 do
  def calc(data) do
    data
    |> Enum.zip()
    |> Enum.map(&Tuple.to_list/1)
    |> Enum.map(&Enum.frequencies/1)
    |> Enum.map(fn %{0 => c0, 1 => c1} -> (c0 > c1 && 0) || 1 end)
    |> then(fn ns ->
      n1 = Integer.undigits(ns, 2)
      n2 = ns |> Enum.map(&(1 - &1)) |> Integer.undigits(2)
      n1 * n2
    end)
  end
end
P1.calc(data)
defmodule P2 do
  def calc(data) do
    data
    |> Enum.map(&List.to_tuple/1)
    |> then(fn ns ->
      n1 = ns |> filter(&Kernel.>/2, 0) |> Tuple.to_list() |> Integer.undigits(2)
      n2 = ns |> filter(&amp;Kernel.<=/2, 0) |> Tuple.to_list() |> Integer.undigits(2)
      n1 * n2
    end)
  end

  def filter([line], _, _) do
    line
  end

  def filter(data, comp, index) do
    data
    |> Enum.map(&amp;elem(&amp;1, index))
    |> Enum.frequencies()
    |> IO.inspect()
    |> then(fn count -> (comp.(count[0], count[1]) &amp;&amp; 0) || 1 end)
    |> then(fn b -> Enum.filter(data, &amp;(elem(&amp;1, index) == b)) end)
    |> then(fn data -> filter(data, comp, index + 1) end)
  end
end
P2.calc(data)