Day 11 Part 1
This commit is contained in:
parent
3fb8a5ec48
commit
1016a2540a
1 changed files with 93 additions and 0 deletions
93
2020/day11/day11.ex
Normal file
93
2020/day11/day11.ex
Normal file
|
|
@ -0,0 +1,93 @@
|
||||||
|
defmodule Day11 do
|
||||||
|
defp read_input do
|
||||||
|
Path.expand('input', Path.dirname(__ENV__.file))
|
||||||
|
|> File.read!()
|
||||||
|
end
|
||||||
|
|
||||||
|
defp parse_layout(text) do
|
||||||
|
String.split(text, "\n", trim: true)
|
||||||
|
|> Enum.with_index()
|
||||||
|
|> Enum.reduce(%{}, fn {line, r}, map ->
|
||||||
|
String.codepoints(line)
|
||||||
|
|> Enum.with_index()
|
||||||
|
|> Enum.reduce(map, fn {char, c}, map ->
|
||||||
|
Map.put(map, {r, c}, char_to_content(char))
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp char_to_content(char) do
|
||||||
|
case char do
|
||||||
|
"." -> :floor
|
||||||
|
"L" -> :empty
|
||||||
|
"#" -> :occupied
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp content(grid, cell) do
|
||||||
|
Map.get(grid, cell, :floor)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp neighbors(grid, {r, c}) do
|
||||||
|
[
|
||||||
|
{r - 1, c - 1},
|
||||||
|
{r - 1, c},
|
||||||
|
{r - 1, c + 1},
|
||||||
|
{r, c - 1},
|
||||||
|
{r, c + 1},
|
||||||
|
{r + 1, c - 1},
|
||||||
|
{r + 1, c},
|
||||||
|
{r + 1, c + 1}
|
||||||
|
]
|
||||||
|
|> Enum.map(&content(grid, &1))
|
||||||
|
end
|
||||||
|
|
||||||
|
defp tick(grid) do
|
||||||
|
Enum.into(grid, %{}, fn {cell, state} ->
|
||||||
|
new_state =
|
||||||
|
case state do
|
||||||
|
:floor ->
|
||||||
|
:floor
|
||||||
|
|
||||||
|
:empty ->
|
||||||
|
if Enum.all?(neighbors(grid, cell), &(&1 != :occupied)) do
|
||||||
|
:occupied
|
||||||
|
else
|
||||||
|
:empty
|
||||||
|
end
|
||||||
|
|
||||||
|
:occupied ->
|
||||||
|
if Enum.count(neighbors(grid, cell), &(&1 == :occupied)) >= 4 do
|
||||||
|
:empty
|
||||||
|
else
|
||||||
|
:occupied
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
{cell, new_state}
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp run(grid) do
|
||||||
|
new_grid = tick(grid)
|
||||||
|
|
||||||
|
if new_grid == grid do
|
||||||
|
grid
|
||||||
|
else
|
||||||
|
run(new_grid)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp count_seated(grid) do
|
||||||
|
Map.values(grid) |> Enum.count(&(&1 == :occupied))
|
||||||
|
end
|
||||||
|
|
||||||
|
def part1 do
|
||||||
|
read_input()
|
||||||
|
|> parse_layout()
|
||||||
|
|> run()
|
||||||
|
|> count_seated()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Day11.part1() |> IO.inspect()
|
||||||
Loading…
Reference in a new issue