Day 6
Setup
Mix.install([
{:kino, "~> 0.4.1"}
])
input = Kino.Input.textarea("Problem input")
parsed_input =
input
|> Kino.Input.read()
|> String.split(",")
|> Stream.map(&String.to_integer/1)
Part 1 and 2
initial_ages =
0..8
|> Enum.map(fn x -> {x, 0} end)
|> Enum.into(%{})
|> Map.merge(parsed_input |> Enum.frequencies())
defmodule Solver do
def decrement(ages) do
{
ages[0],
ages
|> Enum.map(fn
{0, v} -> {6, v}
{k, v} -> {k - 1, v}
end)
|> Enum.reduce(%{}, fn {k, v}, m ->
Map.put(m, k, (m[k] || 0) + v)
end)
}
end
def solve(initial_ages, time_limit) do
Enum.reduce(1..time_limit, initial_ages, fn _day, ages ->
{new_fishes, ages} = decrement(ages)
Map.put(ages, 8, ages[8] || 0 + new_fishes)
end)
|> Map.values()
|> Enum.sum()
end
end
Solver.solve(initial_ages, 256)