Powered by AppSignal & Oban Pro

Day 6: Lanternfish

backup_2021_original/06.livemd

Day 6: Lanternfish

Intro

https://adventofcode.com/2021/day/6

Input

input_test =
  """
  3,4,3,1,2
  """
  |> String.split(["\n", ","], trim: true)
  |> Enum.map(&String.to_integer/1)
[3, 4, 3, 1, 2]
input =
  File.read!("input06.txt")
  |> String.split(["\n", ","], trim: true)
  |> Enum.map(&String.to_integer/1)
[3, 5, 4, 1, 2, 1, 5, 5, 1, 1, 1, 1, 4, 1, 4, 5, 4, 5, 1, 3, 1, 1, 1, 4, 1, 1, 3, 1, 1, 5, 3, 1, 1,
 3, 1, 3, 1, 1, 1, 4, 1, 2, 5, 3, 1, 4, 2, 3, 1, 1, ...]

Part 1

defmodule LF do
  def day_for_fish(0), do: [6, 8]
  def day_for_fish(d), do: d - 1

  def day_for_school(l) do
    l |> Enum.map(&day_for_fish/1) |> List.flatten()
  end

  def run_school(school, 0) do
    Enum.count(school)
  end

  def run_school(school, days) do
    # IO.puts("Day: " <> Integer.to_string(days) <> " -- Lenght: " <> Integer.to_string(length(school)))
    new_school = day_for_school(school)
    run_school(new_school, days - 1)
  end
end
{:module, LF, <<70, 79, 82, 49, 0, 0, 8, ...>>, {:run_school, 2}}
LF.run_school(input_test, 80)
5934
LF.run_school(input, 80)
374927

Correct: 374927

Part 2

i = input_test

%{
  0 => i |> Enum.filter(fn x -> x == 0 end) |> Enum.count(),
  1 => i |> Enum.filter(fn x -> x == 1 end) |> Enum.count(),
  2 => i |> Enum.filter(fn x -> x == 2 end) |> Enum.count(),
  3 => i |> Enum.filter(fn x -> x == 3 end) |> Enum.count(),
  4 => i |> Enum.filter(fn x -> x == 4 end) |> Enum.count(),
  5 => i |> Enum.filter(fn x -> x == 5 end) |> Enum.count(),
  6 => i |> Enum.filter(fn x -> x == 6 end) |> Enum.count(),
  7 => i |> Enum.filter(fn x -> x == 7 end) |> Enum.count(),
  8 => i |> Enum.filter(fn x -> x == 8 end) |> Enum.count()
}
%{0 => 0, 1 => 1, 2 => 1, 3 => 2, 4 => 1, 5 => 0, 6 => 0, 7 => 0, 8 => 0}
defmodule LF2 do
  def group(school) do
    %{
      0 => school |> Enum.filter(fn x -> x == 0 end) |> Enum.count(),
      1 => school |> Enum.filter(fn x -> x == 1 end) |> Enum.count(),
      2 => school |> Enum.filter(fn x -> x == 2 end) |> Enum.count(),
      3 => school |> Enum.filter(fn x -> x == 3 end) |> Enum.count(),
      4 => school |> Enum.filter(fn x -> x == 4 end) |> Enum.count(),
      5 => school |> Enum.filter(fn x -> x == 5 end) |> Enum.count(),
      6 => school |> Enum.filter(fn x -> x == 6 end) |> Enum.count(),
      7 => school |> Enum.filter(fn x -> x == 7 end) |> Enum.count(),
      8 => school |> Enum.filter(fn x -> x == 8 end) |> Enum.count()
    }
  end

  def sum(%{0 => v0, 1 => v1, 2 => v2, 3 => v3, 4 => v4, 5 => v5, 6 => v6, 7 => v7, 8 => v8}) do
    v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8
  end

  def day_for_school(%{
        0 => v0,
        1 => v1,
        2 => v2,
        3 => v3,
        4 => v4,
        5 => v5,
        6 => v6,
        7 => v7,
        8 => v8
      }) do
    %{0 => v1, 1 => v2, 2 => v3, 3 => v4, 4 => v5, 5 => v6, 6 => v7 + v0, 7 => v8, 8 => v0}
  end

  def run_school(school, 0) do
    sum(school)
  end

  def run_school(school, days) do
    new_school = day_for_school(school)
    run_school(new_school, days - 1)
  end
end
{:module, LF2, <<70, 79, 82, 49, 0, 0, 14, ...>>, {:run_school, 2}}
LF2.group(input_test)
|> LF2.run_school(256)
26984457539
LF2.group(input)
|> LF2.run_school(256)
1687617803407

Correct: 1687617803407