Day 6
Setup
input = Aoc.get_input(6)
textarea = Kino.Input.textarea("Puzzle input", default: input)
test_textarea = Kino.Input.textarea("Test input")
options = [
puzzle: "Puzzle",
test: "Test"
]
select = Kino.Input.select("Input source", options)
lines =
select
|> Kino.Input.read()
|> case do
:puzzle -> input
:test -> test_textarea |> Kino.Input.read()
end
|> String.trim()
|> String.split(",", trim: true)
|> Enum.map(&String.to_integer/1)
Part 1
freq = Enum.frequencies(lines)
n = 80
1..n
|> Enum.reduce(freq, fn _, acc ->
new_fish = Map.get(acc, 0, 0)
acc
|> Enum.reduce(%{}, fn
{0, count}, acc ->
Map.update(acc, 6, count, &(&1 + count))
{day, count}, acc ->
Map.update(acc, day - 1, count, &(&1 + count))
end)
|> Enum.into(%{})
|> Map.put(8, new_fish)
end)
|> Map.values()
|> Enum.sum()
Part 2
Same solution from part 1 but with $n = 256$.
freq = Enum.frequencies(lines)
n = 256
1..n
|> Enum.reduce(freq, fn _, acc ->
new_fish = Map.get(acc, 0, 0)
acc
|> Enum.reduce(%{}, fn
{0, count}, acc ->
Map.update(acc, 6, count, &(&1 + count))
{day, count}, acc ->
Map.update(acc, day - 1, count, &(&1 + count))
end)
|> Enum.into(%{})
|> Map.put(8, new_fish)
end)
|> Map.values()
|> Enum.sum()