# Day 11: Chronal Charge - Advent of Code 2018

I did the Advent of Code 2018 day 11 challenge in Elixir! Parts one and two are as follows:

``````defmodule Day11 do
def part1(input) do
input
|> compute_power_levels()
|> max_cell()
end

def part2(input) do
input
|> compute_power_levels()
|> max_cell_dynamic_size()
end

input
end

defp compute_power_levels(input) do
serial_number = String.to_integer(input)

for x <- 1..300, y <- 1..300 do
rack_id = x + 10
power_level = (rack_id * y + serial_number) * rack_id

power_level =
if power_level > 100 do
power_level
|> to_string()
|> String.at(-3)
|> String.to_integer()
else
0
end

power_level = power_level - 5
{{x, y}, power_level}
end
|> Enum.into(%{})
end

defp max_cell(grid) do
for size <- 0..2 do
for x <- 1..(300 - size), y <- 1..(300 - size) do
power_level =
for xs <- 0..size, ys <- 0..size do
Map.get(grid, {x + xs, y + ys}) || 0
end
|> Enum.sum()

{power_level, {x, y}}
end
end
|> List.flatten()
|> Enum.max_by(fn {power_level, _} -> power_level end)
end

defp max_cell_dynamic_size(grid) do
acc = {{0, 0, 0}, 0}

Enum.reduce(1..299, acc, fn x, acc ->
Enum.reduce(1..299, acc, fn y, acc ->
find_largest(x, y, grid, acc)
end)
end)
end

defp find_largest(x, y, grid, acc) do
max_square_size = min(301 - x, 301 - y)
level = grid[{x, y}]

{best, _} =
Enum.reduce(2..max_square_size, {acc, level}, fn square_size,
{{_coord, prev_level} = prev, level} ->
level = sum_square(x, y, square_size, grid, level)

if level > prev_level do
{{{x, y, square_size}, level}, level}
else
{prev, level}
end
end)

best
end

defp sum_square(x0, y0, square_size, grid, acc) do
y = y0 + square_size - 1

acc =
Enum.reduce(x0..(x0 + square_size - 2), acc, fn x, acc ->
acc + grid[{x, y}]
end)

x = x0 + square_size - 1

acc =
Enum.reduce(y0..(y0 + square_size - 1), acc, fn y, acc ->
acc + grid[{x, y}]
end)

acc
end
end

# r Day11; :aoc2018 |> :code.priv_dir() |> Path.join("day11.txt") |> Day11.part1()
# :aoc2018 |> :code.priv_dir() |> Path.join("day11.txt") |> Day11.part2()
``````
```
```
Author

### Simon Escobar Benitez

Colombian Software Engineer (Erlang Solutions)

## Upcoming conferences

Start booking your calendar with more Code Sync conferences happening across the globe. We will be slowly releasing more dates, in the meantime here is what we’ve planned already:

## ARTICLES: 8

### Day 10: The Stars Align - Advent of Code 2018

I did the Advent of Code 2018 day 10 challenge in Elixir! Parts one and two are as follows:

### Day 7: The Sum of Its Parts - Advent of Code 2018

I did the Advent of Code 2018 day 7 challenge in Elixir! Parts one and two are as follows:

### Day 6: Chronal Coordinates - Advent of Code 2018

I did the Advent of Code 2018 day 6 challenge in Elixir! Parts one and two are as follows:

### Day 5: Alchemical Reduction - Advent of Code 2018

I did the Advent of Code 2018 day 5 challenge in Elixir! Parts one and two are as follows:

### Day 4: Repose Record - Advent of Code 2018

I did the Advent of Code 2018 day 4 challenge in Elixir! Parts one and two are as follows:

### Day 3: No matter how you slice it - Advent of Code 2018

I did the Advent of Code 2018 day 3 challenge in Elixir! Parts one and two are as follows:

### Day 2: Inventory Management System - Advent of Code 2018

I did the Advent of Code 2018 day 2 challenge in Elixir! Parts one and two are as follows: