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

Day 7

day_7.livemd

Day 7

Mix.install([
  {:kino, "~> 0.14.2"}
])

Section

eqs = Kino.Input.textarea("equations")
defmodule Day7 do
  def concat(n1, n2) do
    String.to_integer(Integer.to_string(n1) <> Integer.to_string(n2))
  end

  def apply_operators_list(operators, second) do
    fn n ->
      Enum.map(operators, fn func ->
        func.(n, second)
      end)
    end
  end

  def abstract_solution(input_string, operators) do
    input_string
    |> String.split("\n")
    |> Enum.map(fn line ->
      [target_str, numbers_str] = String.split(line, ": ")
      {target, ""} = Integer.parse(target_str)

      [first | numbers] =
        numbers_str
        |> String.split()
        |> Enum.map(&amp;String.to_integer/1)

      numbers
      |> Enum.reduce([first], fn new_number, progresses ->
        Enum.flat_map(progresses, apply_operators_list(operators, new_number))
        # Enum.flat_map(progresses, &[&1 + new_number, &1 * new_number])
      end)
      |> Enum.filter(&amp;(&amp;1 == target))
      |> case do
        [] -> 0
        [numb | _] -> numb
      end
    end)
    |> Enum.sum()
  end
end

Part 1

eqs
|> Kino.Input.read()
|> Day7.abstract_solution([&amp;+/2, &amp;*/2])

Part 2

eqs
|> Kino.Input.read()
|> Day7.abstract_solution([&amp;+/2, &amp;*/2, &amp;Day7.concat/2])