Day 11 Parts 1 and 2

This commit is contained in:
Adam Millerchip 2020-12-11 16:09:17 +09:00
parent 7e21418813
commit bf0a9e6ff7
5 changed files with 362 additions and 1 deletions

View File

@ -2,7 +2,7 @@
My (attempted) solutions to [Advent of Code 2020](https://adventofcode.com/2020) in Elixir.
<img width="975" alt="image" src="https://user-images.githubusercontent.com/498229/101786711-97c33d80-3b41-11eb-831a-d6a9b3670f30.png">
<img width="975" alt="image" src="https://user-images.githubusercontent.com/498229/101872701-0a2b3080-3bc9-11eb-97da-884b52168ecc.png">
## Strategy

37
day11/README Normal file
View File

@ -0,0 +1,37 @@
Day 11 Notes
+--------+
| Part 1 |
+--------+
$ elixir day11part1.exs
2238
Pretty simple brute force that just iterates the full grid, checking the surrounding
seats for each case.
The main point seemed to be that the state was calculated immediately, which means
we need to keep the original state around while building the new state.
+--------+
| Part 2 |
+--------+
$ elixir day11part2.exs
2013
Added check_visible_in_direction to check the full line of sight, rather than just the
adjacent squares, and converted occupied_adjacent to occupied_visible to take advantage
of the new function.
+------------------+
| Overall Thoughts |
+------------------+
Naive, kind of slow brute-force techniques today.
Could look into a more efficient solution, but I didn't find the problem that interesting
so will leave it here.
What's a nice way to track/visualise a coordinate grid in Elixir? 🤔

111
day11/day11part1.exs Normal file
View File

@ -0,0 +1,111 @@
defmodule Day11Part1 do
def run do
File.read!("input")
|> String.split("\n", trim: true)
|> Enum.map(&String.to_charlist/1)
|> parse_seat_plan()
|> run_until_stable()
|> elem(2)
|> count_occupied()
|> IO.inspect()
end
def run_until_stable(state) do
new_state = tick(state)
if new_state == state do
state
else
run_until_stable(new_state)
end
end
def tick({width, height, old_seats}) do
new_seats =
for(
x <- 0..(width - 1),
y <- 0..(height - 1),
do: {x, y}
)
|> Enum.reduce(%{}, fn {x, y}, new_seats ->
toggle(old_seats[{x, y}], x, y, old_seats, new_seats)
end)
{width, height, new_seats}
end
def toggle(:empty, x, y, old_seats, new_seats) do
if occupied_adjacent(x, y, old_seats) == 0 do
Map.put(new_seats, {x, y}, :occupied)
else
Map.put(new_seats, {x, y}, :empty)
end
end
def toggle(:occupied, x, y, old_seats, new_seats) do
if occupied_adjacent(x, y, old_seats) >= 4 do
Map.put(new_seats, {x, y}, :empty)
else
Map.put(new_seats, {x, y}, :occupied)
end
end
def toggle(:floor, x, y, _, new_seats), do: Map.put(new_seats, {x, y}, :floor)
def occupied_adjacent(x, y, seats) do
adjacent = [
{x - 1, y - 1},
{x - 1, y},
{x - 1, y + 1},
{x, y - 1},
{x, y + 1},
{x + 1, y - 1},
{x + 1, y},
{x + 1, y + 1}
]
seats
|> Map.take(adjacent)
|> count_occupied()
end
def count_occupied(seats) do
Enum.count(seats, &match?({_, :occupied}, &1))
end
def parse_seat_plan(input) do
Enum.reduce(input, {0, 0, %{}}, fn row, {_x, y, seats} ->
{x, seats} =
Enum.reduce(row, {0, seats}, fn seat, {x, seats} ->
seat =
case seat do
?L -> :empty
?. -> :floor
end
{x + 1, Map.put(seats, {x, y}, seat)}
end)
{x, y + 1, seats}
end)
end
def visualize({width, height, seats}) do
for y <- 0..(height - 1) do
for x <- 0..(width - 1) do
char =
case seats[{x, y}] do
:empty -> "L"
:floor -> "."
:occupied -> "#"
end
IO.write(char)
end
IO.write("\n")
end
end
end
Day11Part1.run()

121
day11/day11part2.exs Normal file
View File

@ -0,0 +1,121 @@
defmodule Day11Part2 do
def run do
File.read!("input")
|> String.split("\n", trim: true)
|> Enum.map(&String.to_charlist/1)
|> parse_seat_plan()
|> run_until_stable()
|> elem(2)
|> count_occupied()
|> IO.inspect()
end
def run_until_stable(state) do
new_state = tick(state)
if new_state == state do
state
else
run_until_stable(new_state)
end
end
def tick({width, height, old_seats}) do
new_seats =
for(
x <- 0..(width - 1),
y <- 0..(height - 1),
do: {x, y}
)
|> Enum.reduce(%{}, fn {x, y}, new_seats ->
toggle(old_seats[{x, y}], x, y, old_seats, new_seats)
end)
{width, height, new_seats}
end
def toggle(:empty, x, y, old_seats, new_seats) do
if occupied_visible(x, y, old_seats) == 0 do
Map.put(new_seats, {x, y}, :occupied)
else
Map.put(new_seats, {x, y}, :empty)
end
end
def toggle(:occupied, x, y, old_seats, new_seats) do
if occupied_visible(x, y, old_seats) >= 5 do
Map.put(new_seats, {x, y}, :empty)
else
Map.put(new_seats, {x, y}, :occupied)
end
end
def toggle(:floor, x, y, _, new_seats), do: Map.put(new_seats, {x, y}, :floor)
def occupied_visible(x, y, seats) do
directions = [
{-1, -1},
{-1, 0},
{-1, +1},
{0, -1},
{0, +1},
{+1, -1},
{+1, 0},
{+1, +1}
]
Enum.count(directions, fn {vx, vy} -> check_visible_in_direction(x, y, vx, vy, 1, seats) end)
end
def count_occupied(seats) do
Enum.count(seats, &match?({_, :occupied}, &1))
end
def check_visible_in_direction(x, y, vx, vy, distance, seats) do
next = seats[{x + vx * distance, y + vy * distance}]
case next do
nil -> false
:empty -> false
:occupied -> true
:floor -> check_visible_in_direction(x, y, vx, vy, distance + 1, seats)
end
end
def parse_seat_plan(input) do
Enum.reduce(input, {0, 0, %{}}, fn row, {_x, y, seats} ->
{x, seats} =
Enum.reduce(row, {0, seats}, fn seat, {x, seats} ->
seat =
case seat do
?L -> :empty
?. -> :floor
?# -> :occupied
end
{x + 1, Map.put(seats, {x, y}, seat)}
end)
{x, y + 1, seats}
end)
end
def visualize({width, height, seats}) do
for y <- 0..(height - 1) do
for x <- 0..(width - 1) do
char =
case seats[{x, y}] do
:empty -> "L"
:floor -> "."
:occupied -> "#"
end
IO.write(char)
end
IO.write("\n")
end
end
end
Day11Part2.run()

92
day11/input Normal file
View File

@ -0,0 +1,92 @@
LLLLLLLLLL.LLLLL.LLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLL.L
LLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLL.
L.LLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
L..LL......LL.L..LL...L.........L.......LLL........L...L....L...LL.L....L.....LL....L..LL...L..
LL.LLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLL.LLLLLL.L.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLL.LL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLL.L
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LL.LLL.LLLLLLLL.L.LLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.L
L.LLLLLLLL.LL.LL.LLLL..LLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL
...L.L.........LL..L.L.....L....L....L...L...L.LL...LLLLL....L...L......L..LLL..LL.....L..LL..L
LLLLLLLLLL.LLLLL.LLLL.LLLLLL..LLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLL.LLL.
LLLLLLLLLL.LL.LL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LL.LLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LL.LLL..LLLLL.LLLLLLLL.LLLL.LL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLLLLLLLLL.LLL.LLLLLL.LLLLLL.LLLLL.LL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLL.L.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
...L....LL....L.L....L.L.LL.L.LL.L..LL....LL.LL.........L..LL........L.LL..L....LL...L.......LL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL
L.LLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LL.LLLLLL.LLLLL.LLLL.LLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL..LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LL.LLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLL.LL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
..L.....L........LLL.......LL.LL....LL........L..L.L.LLLL.....L..LL....LL.L.L........LL.L.....L
LLLLLLLLLL.LLLLL.L.LL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LL.LL.LLLLL.LL
LLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL..LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLL..LLLLL.LLLLLLLLLLLLLLL.LL.LLLLLLLL.LLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLL.LLL.LLLL.LLLL.LLLLLLLLL.LLLLLLLLLL.LLL
LLLLLL.LLLLLLLLL.LL.L.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LL.LLLLL
L....L..LL..LL..LL......L..LL..LL.LL...L.....L.....L.L...L.LL.....L.......L..LL.........LLLL...
LLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLL.LL.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.L.LLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLL..LLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.L.LLLLL.L.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLL.LLLLLLLL
L..L.L...LL.......L...............L..L....L.LLLL...L.L..L..LL.L...L...L...L.....L...L.....LLL..
LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.L.LLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.L.LL.LLL
L.LLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLL.LLLL.L.LLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL..LLLLLLLL.L.LLLLLL.LLLLLLLL.LLLLLLLLLLLLL...LLLLLLLLL.LLLLLLLLL..LLLLLLLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLL.LLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLLLL.LL.LLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LL.LL.LLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
..L.L....L.L......L..L.....L..L.LLLLL..L...............LLL.LLL.....L.L..L...L.LL.....L...L.....
.LLL.LLL.LLLLLLL.LLLL.LLLLLL.LL.LLL.LLLLLLLLLLLLLLLL.LL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLL..LLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLL..LLLL.LLLL.LLLLLL.LLL.LL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL..LLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
....LLL........L......L.LL.......LL.LL.LL.L.L..LL.L.....L.LLL.....L........LL......L..L.......L
LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LL.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLL.L
LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.L.LLLL.LLL.LL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL..LLLLLLL
LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL..LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
...............L.L...L...L....L..L..L......L.......L..L......LL.LL.LL.L.......L....L......L...L
LLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLLLLLLLL.L.LL.LL.LLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLL
LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLL.L.LLLLLLLLLLLLLLL.LLLLLLLL..LLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL
LLLLL.LLLLLLLLLL.LL.LLLLLLLLLLLLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
....LLL...LL.L....LL.L..L..L.........L.L...L.LLL..L...L..L..L.......L..L.LL.L..LL....LL.L..LLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LL.LL.LLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLL.LLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLL
LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL..LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LL.LLLLLLLLLLLLLL.LL.LLLLLL
LLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.L.LLLLLLL.L.LLLLLLLLLLLLLLL.LLLLLLLL
.LLLLL.LLL.LLLLL.LLLL.LL.LLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LLLL.LLLLLLLLLLL.LLLLLLLL.L..LLLLLLLLLLLLLLL.LLLL..LLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LL
LLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LL.LLLLLLLLLLL
L......L...LL...L.L.L...LL.L...L......L......LL......LL.L.L....LL.LL.......LL...L..LLL...LL...L
LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLL.LLL..LLLLLLLLLLLLLL.LLL.LLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLL.LL.LLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLLL.L.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL..LLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLLLLLLLL..LL.LLLLL.LLLLLLL.LLLLLLLLL.L.LLLLLLL.LLLLL.LLLLLLLL
...L.L.L.....L........LLL.....LL.L.L.LL.....L...LL..L.LLL.....LL.L....L.L...LLL....L...LLLL...L
LLLLLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLL..LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL
LLLLLLLLLL.LLLLL.LLL..LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.L.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLL..LLLLL.LLLL..LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLL.LLLLLLLLLLLLLLLLLL.LL.LLLLLLL.
LLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLL...LLLLLLLLLLLLLL.L.L.LLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLL
LLLLLLLLLL.LLLLL.LL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
.LLLLLLLL..LLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLL.LLLLLL.LLLLL.LLLLL.LL
LLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLL..LLL.LLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLLLLLLLLLLL.L.LL.L.L.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL