Browse Source

Solve 2021 Day 6 in elixir

master
Garrit Franke 2 years ago
parent
commit
c50c1e02ed
Signed by: garrit
GPG Key ID: 65586C4DDA55EA2C
  1. 108
      2021/Day6/Elixir/lanternfish.ex
  2. 1
      2021/Day6/test.txt

108
2021/Day6/Elixir/lanternfish.ex

@ -0,0 +1,108 @@
ExUnit.start()
defmodule Lanternfish do
def load_file() do
File.read!("../input.txt")
|> String.split(",", trim: true)
end
def parse_swarm(input) do
input
|> Enum.group_by(& &1)
|> Enum.map(fn {i, vals} -> {i, Enum.count(vals)} end)
|> Map.new()
end
def give_offspring(fish, 0) do
fish |> Map.delete(9)
end
def give_offspring(fish, days_remaining) do
safe_fish =
fish
|> Map.put_new(0, 0)
|> Map.put_new(1, 0)
|> Map.put_new(2, 0)
|> Map.put_new(3, 0)
|> Map.put_new(4, 0)
|> Map.put_new(5, 0)
|> Map.put_new(6, 0)
|> Map.put_new(7, 0)
|> Map.put_new(8, 0)
|> Map.put_new(9, 0)
safe_fish
|> Map.put(7, safe_fish[7] + safe_fish[0])
|> Map.put(9, safe_fish[9] + safe_fish[0])
|> Enum.map(fn {internal_counter, amount} -> {internal_counter - 1, amount} end)
|> Map.new()
|> Map.delete(-1)
|> Map.delete(9)
|> give_offspring(days_remaining - 1)
end
def solve(days) do
fish =
load_file()
|> Enum.map(&Integer.parse/1)
|> Enum.map(&elem(&1, 0))
|> parse_swarm()
|> give_offspring(days)
Enum.map(fish, fn {_, amount} -> amount end)
|> Enum.sum()
end
@spec first() :: Integer
def first() do
solve(80)
end
@spec second() :: Integer
def second() do
solve(256)
end
end
defmodule LanternfishTest do
use ExUnit.Case
describe "giveOffsprint/2" do
test "Initial value" do
swarm = Lanternfish.parse_swarm([3, 4, 3, 1, 2])
assert Lanternfish.give_offspring(swarm, 0) == %{1 => 1, 2 => 1, 3 => 2, 4 => 1}
end
test "After 1 day" do
swarm = Lanternfish.parse_swarm([3, 4, 3, 1, 2])
assert Lanternfish.give_offspring(swarm, 1) == %{
0 => 1,
1 => 1,
2 => 2,
3 => 1,
4 => 0,
5 => 0,
6 => 0,
7 => 0,
8 => 0
}
end
test "After 2 days" do
swarm = Lanternfish.parse_swarm([3, 4, 3, 1, 2])
assert Lanternfish.give_offspring(swarm, 2) == %{
0 => 1,
1 => 2,
2 => 1,
3 => 0,
4 => 0,
5 => 0,
6 => 1,
7 => 0,
8 => 1
}
end
end
end

1
2021/Day6/test.txt

@ -0,0 +1 @@
3,4,3,1,2
Loading…
Cancel
Save