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

aoc2021-day6

2021/elixir/day-6.livemd

aoc2021-day6

Setup

Mix.install([{:kino, "~> 0.4.0"}])
input = Kino.Input.textarea("")

Part 1

defmodule Recursive do
  def recursive(list, after_days),
    do: list |> Enum.reverse() |> do_recursive(after_days)

  defp do_recursive(list, 0), do: list |> Enum.count()

  defp do_recursive(list, after_days) do
    zero_cnt = list |> Enum.count(&(&1 == 0))
    new_fishes = Stream.repeatedly(fn -> 9 end) |> Enum.take(zero_cnt)

    next_list =
      (new_fishes ++ list)
      |> Enum.map(fn
        d when d == 0 -> 6
        d -> d - 1
      end)

    do_recursive(next_list, after_days - 1)
  end
end
inputs = """
3,4,3,1,2
"""

input
|> Kino.Input.read()
|> String.split([",", "\n"], trim: true)
|> Enum.map(&String.to_integer/1)
|> Recursive.recursive(80)

Part 2

최적화 필요!

defmodule Recursive2 do
  def recursive(fish_map, 0), do: Map.values(fish_map) |> Enum.sum()

  def recursive(fish_map, after_days) do
    fish_map
    |> Enum.reduce(%{}, fn
      {0, cnt}, next_map ->
        next_map
        |> Map.put(8, cnt)
        |> Map.update(6, cnt, &(&1 + cnt))

      {day, cnt}, next_map ->
        next_map |> Map.update(day - 1, cnt, &(&1 + cnt))
    end)
    |> recursive(after_days - 1)
  end
end
inputs = """
3,4,3,1,2
"""

input
|> Kino.Input.read()
|> String.split([",", "\n"], trim: true)
|> Enum.map(&String.to_integer/1)
|> Enum.frequencies()
|> Recursive2.recursive(256)