Day 6: Lanternfish
Mix.install([:kino])
input = Kino.Input.textarea("Please paste your input:")
Part 1
https://adventofcode.com/2021/day/6
Setup
inputs =
input
|> Kino.Input.read()
|> String.split([",", "\n"], trim: true)
|> Enum.map(&String.to_integer/1)
Solve: Part 1
timer_count_map =
inputs
|> Enum.reduce(%{}, fn timer, timer_count_map ->
timer_count_map
|> Map.update(timer, 1, &(&1 + 1))
end)
timer_count_map =
0..8
|> Enum.map(&{&1, 0})
|> Map.new()
|> Map.merge(timer_count_map)
1..80
|> Enum.reduce(timer_count_map, fn _day, timer_count_map ->
zero_count = Map.get(timer_count_map, 0, 0)
timer_count_map
|> Enum.map(fn
{_timer = 0, count} -> {8, count}
{timer, count} -> {timer - 1, count}
end)
|> Map.new()
|> Map.update!(6, &(&1 + zero_count))
end)
|> Map.values()
|> Enum.sum()
Part 2
https://adventofcode.com/2021/day/6#part2
Solve: Part 2
1..256
|> Enum.reduce(timer_count_map, fn _day, timer_count_map ->
zero_count = Map.get(timer_count_map, 0, 0)
timer_count_map
|> Enum.map(fn
{_timer = 0, count} -> {8, count}
{timer, count} -> {timer - 1, count}
end)
|> Map.new()
|> Map.update!(6, &(&1 + zero_count))
end)
|> Map.values()
|> Enum.sum()