mirror of
https://github.com/rjNemo/ai_advent_code_2024
synced 2026-06-06 02:26:44 +00:00
Compare commits
31 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e6c0d59c2b | |||
| fbc39fe430 | |||
| 17655469a6 | |||
| d742148e96 | |||
| 901ad6c645 | |||
| 2d73d1bb51 | |||
| 04787bd7f9 | |||
| 143b8c0742 | |||
| 6132f3d3d2 | |||
| 542cb5b06d | |||
| 4f5ae71599 | |||
| 998b6f6405 | |||
| bacce02f21 | |||
| 6aec2849a1 | |||
| c2e2b4c31c | |||
| 34a89c44f7 | |||
| df41b278f8 | |||
| ae53d65980 | |||
| bdb91371cd | |||
| e1f4afe639 | |||
| 17c17fb4fb | |||
| abce745f07 | |||
| 94526545f9 | |||
| 62603926dc | |||
| a9db3bc044 | |||
| 5958552501 | |||
| ea60e261ff | |||
| 70b2cf2086 | |||
| 787427de18 | |||
| e2dfc001ef | |||
| 645fe19996 |
16 changed files with 2532 additions and 1 deletions
68
lib/advent_code2024/solutions/day03/README.md
Normal file
68
lib/advent_code2024/solutions/day03/README.md
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
# Day 3: Mull It Over
|
||||||
|
|
||||||
|
## Problem Description
|
||||||
|
|
||||||
|
The North Pole Toboggan Rental Shop's computers are having issues with corrupted
|
||||||
|
memory.
|
||||||
|
The program is trying to multiply numbers but the instructions are jumbled up.
|
||||||
|
|
||||||
|
## Rules
|
||||||
|
|
||||||
|
- Valid instructions are in the format `mul(X,Y)` where X and Y are 1-3 digit numbers
|
||||||
|
- Example: `mul(44,46)` multiplies 44 by 46 to get 2024
|
||||||
|
- Invalid instructions should be ignored, examples:
|
||||||
|
- `mul(4*`
|
||||||
|
- `mul(6,9!`
|
||||||
|
- `?(12,34)`
|
||||||
|
- `mul ( 2 , 4 )`
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Given the corrupted memory:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))
|
||||||
|
```
|
||||||
|
|
||||||
|
Only these instructions are valid:
|
||||||
|
|
||||||
|
- mul(2,4)
|
||||||
|
- mul(5,5)
|
||||||
|
- mul(11,8)
|
||||||
|
- mul(8,5)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
Total = (2*4) + (5*5) + (11*8) + (8*5) = 161
|
||||||
|
```
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
Scan the corrupted memory for valid mul instructions and sum their results.
|
||||||
|
|
||||||
|
## Part Two: Conditional Processing
|
||||||
|
|
||||||
|
The solution needs to handle two additional control instructions that affect
|
||||||
|
multiplication processing:
|
||||||
|
|
||||||
|
1. `do()` - enables future multiplication instructions
|
||||||
|
2. `don't()` - disables future multiplication instructions
|
||||||
|
|
||||||
|
Key rules:
|
||||||
|
|
||||||
|
- Multiplications start enabled by default
|
||||||
|
- Only the most recent do()/don't() instruction applies
|
||||||
|
- Only enabled multiplications should be calculated and summed
|
||||||
|
- Control instructions can appear anywhere in the corrupted input
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
mul(2,4)don't()mul(5,5)do()mul(8,5)
|
||||||
|
```
|
||||||
|
|
||||||
|
Result = 48 because:
|
||||||
|
|
||||||
|
- mul(2,4) starts enabled (= 8)
|
||||||
|
- don't() disables mul(5,5) (ignored)
|
||||||
|
- do() re-enables mul(8,5) (= 40)
|
||||||
|
- Total: 8 + 40 = 48
|
||||||
109
lib/advent_code2024/solutions/day03/day3.ex
Normal file
109
lib/advent_code2024/solutions/day03/day3.ex
Normal file
|
|
@ -0,0 +1,109 @@
|
||||||
|
defmodule AdventCode2024.Solutions.Day03 do
|
||||||
|
@moduledoc """
|
||||||
|
Solution for Advent of Code 2024, Day 3
|
||||||
|
"""
|
||||||
|
|
||||||
|
@behaviour AdventCode2024.Solution
|
||||||
|
|
||||||
|
@default_input "priv/inputs/day03/input.txt"
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Solve part 1 of the challenge
|
||||||
|
"""
|
||||||
|
def solve(input \\ @default_input)
|
||||||
|
def solve(""), do: {:error, :no_input}
|
||||||
|
|
||||||
|
def solve(input) when is_binary(input) and input != "" do
|
||||||
|
cond do
|
||||||
|
# Check if it looks like a file path and try to read it
|
||||||
|
String.contains?(input, "/") and not String.contains?(input, "\n") ->
|
||||||
|
case File.read(input) do
|
||||||
|
{:ok, content} -> solve_content(content)
|
||||||
|
{:error, reason} -> {:error, reason}
|
||||||
|
end
|
||||||
|
|
||||||
|
# Treat as direct content
|
||||||
|
true ->
|
||||||
|
solve_content(input)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Solve part 2 of the challenge
|
||||||
|
"""
|
||||||
|
def solve_part2(input \\ @default_input)
|
||||||
|
def solve_part2(""), do: {:error, :no_input}
|
||||||
|
|
||||||
|
def solve_part2(input) when is_binary(input) and input != "" do
|
||||||
|
cond do
|
||||||
|
# Check if it looks like a file path and try to read it
|
||||||
|
String.contains?(input, "/") and not String.contains?(input, "\n") ->
|
||||||
|
case File.read(input) do
|
||||||
|
{:ok, content} -> solve_part2_content(content)
|
||||||
|
{:error, reason} -> {:error, reason}
|
||||||
|
end
|
||||||
|
|
||||||
|
# Treat as direct content
|
||||||
|
true ->
|
||||||
|
solve_part2_content(input)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Private functions
|
||||||
|
|
||||||
|
defp solve_content(""), do: {:error, :no_input}
|
||||||
|
|
||||||
|
defp solve_content(content) when is_binary(content) and content != "" do
|
||||||
|
result =
|
||||||
|
~r/mul\((\d{1,3}),(\d{1,3})\)/
|
||||||
|
|> Regex.scan(content, capture: :all_but_first)
|
||||||
|
|> Enum.map(fn [x, y] ->
|
||||||
|
with {x_int, ""} <- Integer.parse(x),
|
||||||
|
{y_int, ""} <- Integer.parse(y) do
|
||||||
|
x_int * y_int
|
||||||
|
else
|
||||||
|
_ -> 0
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|> Enum.sum()
|
||||||
|
|
||||||
|
{:ok, result}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp solve_part2_content(""), do: {:error, :no_input}
|
||||||
|
|
||||||
|
defp solve_part2_content(content) when is_binary(content) and content != "" do
|
||||||
|
{result, _} = process_multiplications(content)
|
||||||
|
{:ok, result}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp process_multiplications(content) do
|
||||||
|
# Split content into tokens that match either multiplication or control instructions
|
||||||
|
tokens =
|
||||||
|
Regex.scan(~r/(?:mul\(\d{1,3},\d{1,3}\)|do\(\)|don't\(\))|(?:do|don't)\(\)/, content)
|
||||||
|
|> List.flatten()
|
||||||
|
|> Enum.filter(&(&1 in ["do()", "don't()"] or String.starts_with?(&1, "mul(")))
|
||||||
|
|
||||||
|
# Process tokens in order, tracking multiplication state
|
||||||
|
tokens
|
||||||
|
|> Enum.reduce({0, true}, fn token, {sum, multiply_enabled} ->
|
||||||
|
cond do
|
||||||
|
token == "do()" ->
|
||||||
|
{sum, true}
|
||||||
|
|
||||||
|
token == "don't()" ->
|
||||||
|
{sum, false}
|
||||||
|
|
||||||
|
String.starts_with?(token, "mul") && multiply_enabled ->
|
||||||
|
[n1, n2] =
|
||||||
|
Regex.run(~r/mul\((\d{1,3}),(\d{1,3})\)/, token, capture: :all_but_first)
|
||||||
|
|> Enum.map(&String.to_integer/1)
|
||||||
|
|
||||||
|
{sum + n1 * n2, multiply_enabled}
|
||||||
|
|
||||||
|
true ->
|
||||||
|
{sum, multiply_enabled}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
109
lib/advent_code2024/solutions/day04/READme.md
Normal file
109
lib/advent_code2024/solutions/day04/READme.md
Normal file
|
|
@ -0,0 +1,109 @@
|
||||||
|
# Coding Challenge: Ceres Search
|
||||||
|
|
||||||
|
## Problem Summary
|
||||||
|
|
||||||
|
You are presented with a word search puzzle where you must find all occurrences of
|
||||||
|
the word "XMAS". The word can appear in various directions and orientations, including:
|
||||||
|
|
||||||
|
- Horizontal (left-to-right and right-to-left)
|
||||||
|
- Vertical (top-to-bottom and bottom-to-top)
|
||||||
|
- Diagonal (both directions)
|
||||||
|
- Overlapping with other words
|
||||||
|
|
||||||
|
## Example Puzzle
|
||||||
|
|
||||||
|
Below is a simplified word search grid where irrelevant characters are replaced
|
||||||
|
with `.`:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
..X...
|
||||||
|
.SAMX.
|
||||||
|
.A..A.
|
||||||
|
XMAS.S
|
||||||
|
.X....
|
||||||
|
```
|
||||||
|
|
||||||
|
In this grid, "XMAS" can appear in multiple ways.
|
||||||
|
|
||||||
|
## Larger Example
|
||||||
|
|
||||||
|
For the following complete grid:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
MMMSXXMASM
|
||||||
|
MSAMXMSMSA
|
||||||
|
AMXSXMAAMM
|
||||||
|
MSAMASMSMX
|
||||||
|
XMASAMXAMM
|
||||||
|
XXAMMXXAMA
|
||||||
|
SMSMSASXSS
|
||||||
|
SAXAMASAAA
|
||||||
|
MAMMMXMMMM
|
||||||
|
MXMXAXMASX
|
||||||
|
```
|
||||||
|
|
||||||
|
The word "XMAS" occurs **18 times**. Visualizing the grid with only the letters
|
||||||
|
in "XMAS" highlighted:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
....XXMAS.
|
||||||
|
.SAMXMS...
|
||||||
|
...S..A...
|
||||||
|
..A.A.MS.X
|
||||||
|
XMASAMX.MM
|
||||||
|
X.....XA.A
|
||||||
|
S.S.S.S.SS
|
||||||
|
.A.A.A.A.A
|
||||||
|
..M.M.M.MM
|
||||||
|
.X.X.XMASX
|
||||||
|
```
|
||||||
|
|
||||||
|
## Objective
|
||||||
|
|
||||||
|
For the given puzzle input, calculate and return the total number of times the word
|
||||||
|
"XMAS" appears in all possible orientations.
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Words can overlap and share characters.
|
||||||
|
- Input will be a rectangular grid of letters.
|
||||||
|
|
||||||
|
Good luck helping the little Elf! 🌟
|
||||||
|
|
||||||
|
## Part 2 Challenge
|
||||||
|
|
||||||
|
The Elf looks quizzically at you. Did you misunderstand the assignment?
|
||||||
|
|
||||||
|
Looking for the instructions, you flip over the word search to find that this
|
||||||
|
isn't actually an XMAS puzzle; it's an X-MAS puzzle in which you're supposed to
|
||||||
|
find two MAS in the shape of an X. One way to achieve that is like this:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
M.S
|
||||||
|
.A.
|
||||||
|
M.S
|
||||||
|
```
|
||||||
|
|
||||||
|
Irrelevant characters have again been replaced with `.` in the above diagram.
|
||||||
|
Within the X, each MAS can be written forwards or backwards.
|
||||||
|
|
||||||
|
Here's the same example from before, but this time all of the X-MASes have been
|
||||||
|
kept instead:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
.M.S......
|
||||||
|
..A..MSMS.
|
||||||
|
.M.S.MAA..
|
||||||
|
..A.ASMSM.
|
||||||
|
.M.S.M....
|
||||||
|
..........
|
||||||
|
S.S.S.S.S.
|
||||||
|
.A.A.A.A..
|
||||||
|
M.M.M.M.M.
|
||||||
|
..........
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, an X-MAS appears 9 times.
|
||||||
|
|
||||||
|
Flip the word search from the instructions back over to the word search side and
|
||||||
|
try again. How many times does an X-MAS appear?
|
||||||
183
lib/advent_code2024/solutions/day04/day4.ex
Normal file
183
lib/advent_code2024/solutions/day04/day4.ex
Normal file
|
|
@ -0,0 +1,183 @@
|
||||||
|
defmodule AdventCode2024.Solutions.Day04 do
|
||||||
|
@behaviour AdventCode2024.Solution
|
||||||
|
|
||||||
|
@default_input "priv/inputs/day04/input.txt"
|
||||||
|
|
||||||
|
def count_word_occurrences(grid, word) when is_list(grid) do
|
||||||
|
grid
|
||||||
|
|> Enum.map(&String.graphemes/1)
|
||||||
|
|> find_word(String.graphemes(word))
|
||||||
|
end
|
||||||
|
|
||||||
|
defp find_word(grid, word) do
|
||||||
|
directions = [
|
||||||
|
# Right
|
||||||
|
{0, 1},
|
||||||
|
# Down
|
||||||
|
{1, 0},
|
||||||
|
# Left
|
||||||
|
{0, -1},
|
||||||
|
# Up
|
||||||
|
{-1, 0},
|
||||||
|
# Down-right diagonal
|
||||||
|
{1, 1},
|
||||||
|
# Up-left diagonal
|
||||||
|
{-1, -1},
|
||||||
|
# Down-left diagonal
|
||||||
|
{1, -1},
|
||||||
|
# Up-right diagonal
|
||||||
|
{-1, 1}
|
||||||
|
]
|
||||||
|
|
||||||
|
grid
|
||||||
|
|> Enum.with_index()
|
||||||
|
|> Enum.reduce(0, fn {row, row_idx}, acc ->
|
||||||
|
row
|
||||||
|
|> Enum.with_index()
|
||||||
|
|> Enum.reduce(acc, fn {_, col_idx}, acc_inner ->
|
||||||
|
acc_inner + count_word_from(grid, word, {row_idx, col_idx}, directions)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp count_word_from(grid, word, {row, col}, directions) do
|
||||||
|
directions
|
||||||
|
|> Enum.reduce(0, fn direction, acc ->
|
||||||
|
if find_word?(grid, word, {row, col}, direction) do
|
||||||
|
acc + 1
|
||||||
|
else
|
||||||
|
acc
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp find_word?(grid, word_chars, {row, col}, {d_row, d_col}) do
|
||||||
|
word_chars
|
||||||
|
|> Enum.with_index()
|
||||||
|
|> Enum.all?(fn {char, i} ->
|
||||||
|
new_row = row + i * d_row
|
||||||
|
new_col = col + i * d_col
|
||||||
|
within_bounds?(grid, new_row, new_col) && Enum.at(Enum.at(grid, new_row), new_col) == char
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp within_bounds?(grid, row, col) do
|
||||||
|
row >= 0 and row < length(grid) and col >= 0 and col < length(Enum.at(grid, 0))
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Reads a grid from a file and counts the occurrences of a word using `count_word/2`.
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
- file_path: The path to the file containing the grid.
|
||||||
|
- word: The word to be searched for.
|
||||||
|
|
||||||
|
## Returns
|
||||||
|
- The number of times the word is found in the grid.
|
||||||
|
"""
|
||||||
|
def solve(file_path \\ @default_input) do
|
||||||
|
file_path
|
||||||
|
|> File.stream!()
|
||||||
|
|> Enum.map(&String.trim/1)
|
||||||
|
|> count_word_occurrences("XMAS")
|
||||||
|
end
|
||||||
|
|
||||||
|
def solve_part2(input_file \\ @default_input) do
|
||||||
|
input_file
|
||||||
|
|> File.stream!()
|
||||||
|
|> Stream.map(&String.trim/1)
|
||||||
|
|> Enum.to_list()
|
||||||
|
|> count_x_mas()
|
||||||
|
end
|
||||||
|
|
||||||
|
def count_x_mas(grid) do
|
||||||
|
processed_grid = Enum.map(grid, &String.graphemes/1)
|
||||||
|
|
||||||
|
processed_grid
|
||||||
|
|> Enum.with_index()
|
||||||
|
|> Enum.reduce(0, fn {row, row_idx}, acc ->
|
||||||
|
row
|
||||||
|
|> Enum.with_index()
|
||||||
|
|> Enum.reduce(acc, fn {cell, col_idx}, acc_inner ->
|
||||||
|
# Start from the center A
|
||||||
|
if cell == "A" do
|
||||||
|
acc_inner + check_x_patterns(processed_grid, {row_idx, col_idx})
|
||||||
|
else
|
||||||
|
acc_inner
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp check_x_patterns(grid, {row, col}) do
|
||||||
|
# Check both 1-step and 2-step patterns
|
||||||
|
[1, 2]
|
||||||
|
|> Enum.reduce(0, fn step, acc ->
|
||||||
|
if check_x_pattern(grid, {row, col}, step) do
|
||||||
|
acc + 1
|
||||||
|
else
|
||||||
|
acc
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp check_x_pattern(grid, {row, col}, step) do
|
||||||
|
# For a valid X pattern, we need:
|
||||||
|
# 1. Both diagonals must have valid MAS patterns
|
||||||
|
# 2. The patterns must not share any positions except the center A
|
||||||
|
# 3. Both diagonals must be the same length (step)
|
||||||
|
top_left = {row - step, col - step}
|
||||||
|
top_right = {row - step, col + step}
|
||||||
|
bottom_left = {row + step, col - step}
|
||||||
|
bottom_right = {row + step, col + step}
|
||||||
|
|
||||||
|
# Check if all positions are within bounds
|
||||||
|
# Check both diagonals
|
||||||
|
# First diagonal: top-left to bottom-right
|
||||||
|
# First diagonal: bottom-right to top-left (reverse)
|
||||||
|
# Second diagonal: top-right to bottom-left
|
||||||
|
# Second diagonal: bottom-left to top-right (reverse)
|
||||||
|
within_bounds?(grid, row - step, col - step) and
|
||||||
|
within_bounds?(grid, row - step, col + step) and
|
||||||
|
within_bounds?(grid, row + step, col - step) and
|
||||||
|
within_bounds?(grid, row + step, col + step) and
|
||||||
|
(check_diagonal_pattern(grid, top_left, bottom_right, {row, col}) or
|
||||||
|
check_diagonal_pattern(grid, bottom_right, top_left, {row, col})) and
|
||||||
|
(check_diagonal_pattern(grid, top_right, bottom_left, {row, col}) or
|
||||||
|
check_diagonal_pattern(grid, bottom_left, top_right, {row, col}))
|
||||||
|
end
|
||||||
|
|
||||||
|
defp check_diagonal_pattern(
|
||||||
|
grid,
|
||||||
|
{start_row, start_col},
|
||||||
|
{end_row, end_col},
|
||||||
|
{center_row, center_col}
|
||||||
|
) do
|
||||||
|
start_char = Enum.at(Enum.at(grid, start_row), start_col)
|
||||||
|
center_char = Enum.at(Enum.at(grid, center_row), center_col)
|
||||||
|
end_char = Enum.at(Enum.at(grid, end_row), end_col)
|
||||||
|
|
||||||
|
# Check if we have M->A->S in this order
|
||||||
|
# Or S->A->M in this order
|
||||||
|
(start_char == "M" and center_char == "A" and end_char == "S") or
|
||||||
|
(start_char == "S" and center_char == "A" and end_char == "M")
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Reads a grid from a file and counts the occurrences of a word using `count_word/2`.
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
- file_path: The path to the file containing the grid.
|
||||||
|
- word: The word to be searched for.
|
||||||
|
|
||||||
|
## Returns
|
||||||
|
- The number of times the word is found in the grid.
|
||||||
|
"""
|
||||||
|
def count_word_from_file(file_path, word) do
|
||||||
|
file_path
|
||||||
|
|> File.stream!()
|
||||||
|
|> Enum.map(&String.trim/1)
|
||||||
|
|> Enum.map(&String.graphemes/1)
|
||||||
|
|> count_word_occurrences(word)
|
||||||
|
end
|
||||||
|
end
|
||||||
111
lib/advent_code2024/solutions/day05/README.md
Normal file
111
lib/advent_code2024/solutions/day05/README.md
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
# Day 5: Print Queue
|
||||||
|
|
||||||
|
## Part 1
|
||||||
|
|
||||||
|
Print the safety manual pages in the correct order.
|
||||||
|
The notation X|Y means that if both page number X and page number Y are to be produced
|
||||||
|
as part of an update, page number X must be printed at some point before page number Y.
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
The input contains both the page ordering rules and the pages to produce in each update.
|
||||||
|
|
||||||
|
```txt
|
||||||
|
47|53
|
||||||
|
97|13
|
||||||
|
97|61
|
||||||
|
97|47
|
||||||
|
75|29
|
||||||
|
61|13
|
||||||
|
75|53
|
||||||
|
29|13
|
||||||
|
97|29
|
||||||
|
53|29
|
||||||
|
61|53
|
||||||
|
97|53
|
||||||
|
61|29
|
||||||
|
47|13
|
||||||
|
75|47
|
||||||
|
97|75
|
||||||
|
47|61
|
||||||
|
75|61
|
||||||
|
47|29
|
||||||
|
75|13
|
||||||
|
53|13
|
||||||
|
|
||||||
|
75,47,61,53,29
|
||||||
|
97,61,53,29,13
|
||||||
|
75,29,13
|
||||||
|
75,97,47,61,53
|
||||||
|
61,13,29
|
||||||
|
97,13,75,29,47
|
||||||
|
```
|
||||||
|
|
||||||
|
The first section specifies the page ordering rules, one per line.
|
||||||
|
The first rule, `47|53`, means that if an update includes both page number 47 and
|
||||||
|
page number 53, then page number 47 must be printed at some point before page
|
||||||
|
number 53. (47 doesn't necessarily need to be immediately before 53; other pages
|
||||||
|
are allowed to be between them.)
|
||||||
|
|
||||||
|
The second section specifies the page numbers included in each update. Because most
|
||||||
|
safety manuals are different, the pages needed in the updates are different too.
|
||||||
|
The first update, `75,47,61,53,29`, means that the update consists of page
|
||||||
|
numbers 75, 47, 61, 53, and 29.
|
||||||
|
|
||||||
|
To get the printers going as soon as possible, start by identifying which updates
|
||||||
|
are already in the right order.
|
||||||
|
|
||||||
|
In the above example, the first update (75,47,61,53,29) is in the right order:
|
||||||
|
|
||||||
|
- 75 is correctly first because there are rules that put each other page after it: 75|47, 75|61, 75|53, and 75|29.
|
||||||
|
- 47 is correctly second because 75 must be before it (75|47) and every other page must be after it according to 47|61, 47|53, and 47|29.
|
||||||
|
- 61 is correctly in the middle because 75 and 47 are before it (75|61 and 47|61) and 53 and 29 are after it (61|53 and 61|29).
|
||||||
|
- 53 is correctly fourth because it is before page number 29 (53|29).
|
||||||
|
- 29 is the only page left and so is correctly last.
|
||||||
|
|
||||||
|
Because the first update does not include some page numbers, the ordering rules
|
||||||
|
involving those missing page numbers are ignored.
|
||||||
|
|
||||||
|
The second and third updates are also in the correct order according to the rules.
|
||||||
|
Like the first update, they also do not include every page number, and so only some
|
||||||
|
of the ordering rules apply - within each update, the ordering rules that involve
|
||||||
|
missing page numbers are not used.
|
||||||
|
|
||||||
|
The fourth update, 75,97,47,61,53, is not in the correct order: it would print 75
|
||||||
|
before 97, which violates the rule 97|75.
|
||||||
|
|
||||||
|
The fifth update, 61,13,29, is also not in the correct order, since it breaks the
|
||||||
|
rule 29|13.
|
||||||
|
|
||||||
|
The last update, 97,13,75,29,47, is not in the correct order due to breaking
|
||||||
|
several rules.
|
||||||
|
|
||||||
|
For some reason, the Elves also need to know the middle page number of each update being printed. Because you are currently only printing the correctly-ordered updates, you will need to find the middle page number of each correctly-ordered update. In the above example, the correctly-ordered updates are:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
75,47,61,53,29
|
||||||
|
97,61,53,29,13
|
||||||
|
75,29,13
|
||||||
|
```
|
||||||
|
|
||||||
|
These have middle page numbers of 61, 53, and 29 respectively. Adding these page numbers together gives `143`.
|
||||||
|
|
||||||
|
Of course, you'll need to be careful: the actual list of page ordering rules is bigger and more complicated than the above example.
|
||||||
|
|
||||||
|
Determine which updates are already in the correct order. What do you get if you add up the middle page number from those correctly-ordered updates?
|
||||||
|
|
||||||
|
## Part 2
|
||||||
|
|
||||||
|
While the Elves get to work printing the correctly-ordered updates, you have a little time to fix the rest of them.
|
||||||
|
|
||||||
|
For each of the incorrectly-ordered updates, use the page ordering rules to put the page numbers in the right order. For the above example, here are the three incorrectly-ordered updates and their correct orderings:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
75,97,47,61,53 becomes 97,75,47,61,53.
|
||||||
|
61,13,29 becomes 61,29,13.
|
||||||
|
97,13,75,29,47 becomes 97,75,47,29,13.
|
||||||
|
```
|
||||||
|
|
||||||
|
After taking only the incorrectly-ordered updates and ordering them correctly, their middle page numbers are 47, 29, and 47. Adding these together produces `123`.
|
||||||
|
|
||||||
|
Find the updates which are not in the correct order. What do you get if you add up the middle page numbers after correctly ordering just those updates?
|
||||||
109
lib/advent_code2024/solutions/day05/day5.ex
Normal file
109
lib/advent_code2024/solutions/day05/day5.ex
Normal file
|
|
@ -0,0 +1,109 @@
|
||||||
|
defmodule AdventCode2024.Solutions.Day05 do
|
||||||
|
@moduledoc """
|
||||||
|
Day 5: Solution for Advent of Code 2024
|
||||||
|
"""
|
||||||
|
|
||||||
|
@behaviour AdventCode2024.Solution
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def solve(""), do: {:error, :no_input}
|
||||||
|
|
||||||
|
def solve(path \\ "priv/inputs/day05/input.txt") do
|
||||||
|
case File.read(path) do
|
||||||
|
{:ok, content} -> solve_content(content)
|
||||||
|
{:error, :enoent} -> {:error, :enoent}
|
||||||
|
_ -> {:error, :no_input}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def solve_content(""), do: {:error, :no_input}
|
||||||
|
|
||||||
|
def solve_content(content) do
|
||||||
|
{rules, updates} = parse_input(content)
|
||||||
|
valid_updates = Enum.filter(updates, &is_valid_update?(&1, rules))
|
||||||
|
sum = valid_updates |> Enum.map(&get_middle_number/1) |> Enum.sum()
|
||||||
|
{:ok, sum}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def solve_part2(""), do: {:error, :no_input}
|
||||||
|
|
||||||
|
def solve_part2(path \\ "priv/inputs/day05/input.txt") do
|
||||||
|
case File.read(path) do
|
||||||
|
{:ok, content} -> solve_part2_content(content)
|
||||||
|
{:error, :enoent} -> {:error, :enoent}
|
||||||
|
_ -> {:error, :no_input}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def solve_part2_content(""), do: {:error, :no_input}
|
||||||
|
|
||||||
|
def solve_part2_content(content) do
|
||||||
|
{rules, updates} = parse_input(content)
|
||||||
|
invalid_updates = Enum.reject(updates, &is_valid_update?(&1, rules))
|
||||||
|
|
||||||
|
sum =
|
||||||
|
invalid_updates
|
||||||
|
|> Enum.map(&order_update(&1, rules))
|
||||||
|
|> Enum.map(&get_middle_number/1)
|
||||||
|
|> Enum.sum()
|
||||||
|
|
||||||
|
{:ok, sum}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp parse_input(content) do
|
||||||
|
[rules_str, updates_str] = String.split(content, "\n\n", trim: true)
|
||||||
|
rules = parse_rules(rules_str)
|
||||||
|
updates = parse_updates(updates_str)
|
||||||
|
{rules, updates}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp parse_rules(rules_str) do
|
||||||
|
rules_str
|
||||||
|
|> String.split("\n", trim: true)
|
||||||
|
|> Enum.map(fn rule ->
|
||||||
|
[first, second] = String.split(rule, "|")
|
||||||
|
{String.to_integer(first), String.to_integer(second)}
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp parse_updates(updates_str) do
|
||||||
|
updates_str
|
||||||
|
|> String.split("\n", trim: true)
|
||||||
|
|> Enum.map(fn line ->
|
||||||
|
line
|
||||||
|
|> String.split(",")
|
||||||
|
|> Enum.map(&String.to_integer/1)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp is_valid_update?(update, rules) do
|
||||||
|
update
|
||||||
|
|> Enum.chunk_every(2, 1, :discard)
|
||||||
|
|> Enum.all?(fn [a, b] -> is_valid_order?(a, b, rules) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp is_valid_order?(a, b, rules) do
|
||||||
|
not Enum.any?(rules, fn {x, y} -> x == b and y == a end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_middle_number(list) do
|
||||||
|
middle_index = div(length(list), 2)
|
||||||
|
Enum.at(list, middle_index)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp order_update(update, rules) do
|
||||||
|
update
|
||||||
|
|> Enum.sort(fn a, b ->
|
||||||
|
case {should_come_before?(a, b, rules), should_come_before?(b, a, rules)} do
|
||||||
|
{true, false} -> true
|
||||||
|
{false, true} -> false
|
||||||
|
_ -> a > b
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp should_come_before?(a, b, rules) do
|
||||||
|
Enum.any?(rules, fn {x, y} -> x == a and y == b end)
|
||||||
|
end
|
||||||
|
end
|
||||||
6
priv/inputs/day03/input.txt
Normal file
6
priv/inputs/day03/input.txt
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
);>]mul(437,864)^mul(880,907)}<how(){+[!' where()mul(215,270)from())@#mul(737,510)@<'why()+mul(634,344)$>::mul(528,832);{~<mul(514,817)>~who()who()(how(84,130)where(){%{mul(270,137)@:mul(787,669)*]&^' @from()mul(896,940){where()when()]< -[mul(536,622)select()!{don't()-+^()!)}select()mul(287,737)&who()mul(452,401)from(763,594)$*when()select()&mul(804,971);}<~,(^%)[mul(148,448)mul(835,400)[}*$ #,do()?where(362,730)~why()#(;mul(448,254)'-/who() from():don't():what()'~(select()%mul(538,987): who()/#where()/what()where(587,42)select()mul(571,802)why()<]+}:#mul(446,206),/from()select()mul(271,435);#+^mul(8,739)-:~;<mul(361,969)+?^mul(238,723)<+<$<from()$$mul(93,726)}>?+~[#~mul(370,931)'}select()who()/when()from()%from()who()do()#mul(935,409)mul(356,457)]#mul(445,30)?&^'where()&%<&mul(568,491)when()/^@who()when()&~#)mul(327,654):from(){+?#what()<?;don't()when()<?from():why()^mul(69,349)~!why()-from()[> @!mul(136,811)mul(735,58)'from(242,599)don't()where(),&(mul(306,552)when()&^]do()/]>*,-(;why()mul(641,212)%don't(){mul(39,383);][[*mul(61,441),how()])why()~where()from()mul(688,328){~)(:&}!~#mul(230,832)*[!~ /'~don't()who()where()what()}mul(506,339)('<mul(9,362)$:@how()&&,-mul(776,717)]*)what()who()&&@how()>don't():[>&[#?)when()mul(573,558))-what()~why()how()where()~->mul(932,906)mul(938,661) ):who()do()from()*mul(926,267);/: };^select()mul(750,244)^*what()$what()who()~}from()do()){,'}mul(523,581)-%@>+>mul(94,990)!/who(571,986)/-/?mul(174,631)from()%+?>@<?#)mul(57,234)?}mul(943,865)'([why()what()from()@%%,mul(633,471) where(),select()mul(232,415)), when()<mul(126,82)what()who()what()mul(687,55){select()/what()mul(674,305)>+[^*who()mul(261,413)?-who()^]from()%do()$)~;mul(930,454)$[~;select()why()select()who():@mul(590,349)**%;mul(688,279)+from()^mul(86,495);mul(417,700)what()(/^: ;+<when()mul(383,608)where()!when()when()[-#}*mul(736,637)}'select()[&<select()where()-/mul(440,969)<,{mul(412,588)}{when()where()how(){?{}from()do()select()~&select()'?%>why()mul(312,134)'?<]^@]@!$mul(400,368)/mul(91,772)^mul(108,930)&-mul(370,824) /',why()mul(408,938)#?)^'what()mul(618,424)!mul(384,342)where(695,275)select(){};#select()mul(158,114)[from() ,)what(581,474)who()%]mul(727,849)@%~>]%mul(358,870)mul(918,280)]&mul(434,803)when()#&@@how()}]['mul(737,295)!!->where()<mul(971,370)what()^,when()mul(134,354)/@)(when()mul(995,35):?,#&what()#+~mul(85,68)(';?>mul(108,927)why()select()~mul(268,521)<<[where()-mul(473,558)#why()[how()(<who()mul(383,864)'@[from(),where(234,990)^)when()select(875,735)don't()-how();:(>select()mul(302,377)/#mul(658,882)]mul(400,990) }:%-!]mul(899,38){@mul(389,779)*#!~what()mul(684,353)~who()<]$<mul(909,339)mul(989,387@#:how()&?,*}mul(817,210)mul(270,752)?<select(),who() [,^where()mul(337,83)!when(4,150)from() +$[[when()mul(345,438)[{${$when()from()how(),mul(210,219):select();*#>/mul(69,288)from()who()>#mul(329,484)mul(652,755)from(93,321)^select()select()mul(446,336)~}]where()what()<?+who()mul(686,628);select()mul(270,937)mul(582,221)why()}how()mul(19,975){how()]when()who()where()$+when()do()mul(900,993)mul(613,135)#('who()!why(726,584)};mul(375,245):@>'-^'mul+*,)why()mul(487,896)]%}mul(807,261)@where()(from()-what()%*mulfrom() when()how()<~{~:mul(800,203)mul(921,126)'why()-mul(668,781)% (mul(900,757)^@&{mul(710,725)(?><select()!who()how()@mul(121,934)when()from()&mul(551,3)({{&select()mul(7,711)(]select()!!who()/mul(392,449)
|
||||||
|
>']%<mul(428,73)(what()mul(64,592)why()mul(87,558)!who()/^select()mul[mul(824,660)'where()how()})mul(640,76){mul(775,707)])select()mul(100,878)&(where()]do()<mul(966,147)why()(]why()^(?what()don't())%&>)!;select()*-mul(538,368)]!,mul(570,271){ select(),mul(26,524):!mul(927,601)where()',$&,,mul(135,121)@why()-from() &&mul(166,196)from()mul(847,84)(who()from()why()from()mul(792,999)how()?when()mul(251,498)>(mul(441,614)%%what()%,where()mul(777,118)<&don't()};}from()where()^~@/mul(38,906)~mul(878,986)mul(488,713);what(){how()+]?mul(816,172)what()mul(859,756)how()mul(317,431)/what()(mul(413,319)[!#/(^]('mul@how()mul(369,678)<+[/!?how()when()mul(174{+$ mul(694,959)^how()&:<who()#mul(143,891)+from()@?what()@^}select()mul(361,245)'where()&mul(91,214)%what()]>?~%];)mul(219,426)[@%(where()]@@}mul(639,368)#!#,what()what()mul(703,822){what()where(388,21)~what()@ (mul(209,455))@'who()mul(895,762)+[select()$mul(473,702)who();)!+mul(583,550)>?mul(675,229)(+'[]mul(401,612)mul(410,253)+]>]who()/^from():where()mul(453,54)}(!mul(276,220)'>mul(940,324)mul(172,454)?:~who()mul(729,261){what(){*%where()~'when()]mul(199,694)(~(<@when()mul(515,554)'mul(234,657)@!)>)*~}why() mul(913,964)mul(149,132)/~mul(373,142)where()[mul(324,854)&how() +{&%,mul(872,613)*<why()[])?[do()mul(506,436)!@why()mul(308,28)?&who()+mul(130,254]when()!mul(57,512)$*~mul(874,349)when(){]mul(128,288)[who()}$]:!(mul(117,644)select(59,177)#+,how()from()% mul(701,276)from()@;(why()! -*}mul(784,997)who()where()$how()where()mul(883,710);when()mul(45,149)(where()/do()who()select()[why());,mul(296,703)? mul(881,162)'[why()*mul(293,304)*& mul(443,960)#who(757,994)&<(@#+);mul(739,318)&,when()[where()mul(281,625) why()/+]what()mul(88,646)%~~select()%who()<mul(885,753)::from()![when()mul(625,409)$mul(201,618)<who()#where()from()@/mul(290,974:;&>-:,+select()from()mul(942,583)select()<!,mul(876,685)why())mul(103,616)where(52,533)why()##mul(867,558)what()when())!mul(955,743)-%from(672,345) how()do()*:who()!><{what()mul(488,404)@mul(573,892)'(mulhow()when()'/mul(344,334)select()>#!}mul(868,909),$%mul(729,810)mul(630,215),{?how()where()*select()mul(229,873)%~from()*<% #^who()mul(248,481)why(541,729)select()]mul(639,438)~({ +]( }mul(563,361)^:$?;mul(148,895)!~how(677,192)select();mul(703,618)-how()from(),:,}#mul(383,639)#!mul(164,723)when()<select(960,127)from()$'{%~;mul(45,490))@mul(110/!#':; (]<mul(661,87) [what()?/mul(854,581)from()],$]@>>mul(619,575)-%$,;^mul(712,573)>/(-#;how(626,802)mul(604,893)mul(227,185)>,*what(259,152))!mul(805,458)]&)-,~why();mul{[ ,>who(634,559)@mul(242,122)mul(745,329)who()how()^)%/mul(256,115)- $}<mul(925,466what(757,32)select()+!;mul(958,717) &';;mul(616,882)mul(199,18)/?+]why()[*mul(23,351)(@(mul(615,742):-*)mul(590,124)mul(985,821)@%select()mul(487,459)&mul(319,344)*[*from()select()<+,mul(305,231);($where(112,479)~{;mul(232,514)~!'~from()[;[mul(401,476)<mul(485,814)#'mul(490,69)who()<@where()-/}$:-do():},when())> @$>mul(428,81)where()(&where()}do()when(338,441)^}$<<where()>)mul(587,14)%select(),%{!?}when(){mul(66,344)#how()[,from()who()! :(mul(690,739)}mul(502,75)} +where(368,348)from()'where()where()/&mul(550,732)
|
||||||
|
[<$''what()why(610,674);mul(533,251)/mul(226,855);mul(295,649)]-what() {,(@mul(737,515)when(471,162)mul(751,898){%,>>{(when()when()select()mul(865,649)>$#from()mul(614,590:)how()*~where()-mul(874,991)how()<}:why(846,672);mul(828,195))mul(739,482) ;]/{(%who()mul(521,901))@!select()>why()mul(112,628)!]how()[%!'mul(851,646)$>when()mul(842,55)%$why()mul(164,534) where()::where()mul(145,6)]*when()+@#&(mul(459,695)when()<$}how()$[how(526,933)who(73,62)>mul(527,796)what()*;-!mul(183,596);mul(837,933)mul(693,684)!)] select()[ !mul(379,67)select(){who(333,123)>mul(120,112)?how()@what()why()why(535,724)mul$,,mul(661,256)?why()*mul(894,631)^$from()#]/@mul(111,135)who()$who()how()how()when()$) mul(337,371)]~from()don't()select()-<^mul(706,999){#^$+~+;mul(667,389)+~%/>%mul(471,136)mul(409,563)}where(785,260)~who()mul- )<]mul(476,262):select()what()?&<'$when()(mul(567,673)&who()mul(802,520)){<!why()why()}>-$mul(155,808)$+mul(392,146)&when()[,mul(505,764)%mul(997,837)<'-&why()[#mul(14,131)where()*why()where()@@do()<:,&*mul(453,440)^/[mul(977,343)~[%from()mul(62,672)<$do()#%mul(971,495)}what()mul(98,733);how()!mul(815,13)when())##mul(12,514)!#*:^where()@?mul(704,581)+mul(656,388)mul(968,264)how()who(459,907)!!&;$mul(639,135)who();!mul(554,238)-*,%~<mul(549,330)select()who(214,680)>-'^mul(613,35)({*;)'mul(300,593)?} /why(366,710)don't()mul(541,734)why(770,959)?when()<who()([+mul(110,600)select()}why())mul(936,678)how()from()+:&select()~ mul(564,294)/where()who()@mul(583,664){%;;>+<mul(354,509)why():mul(112,317)*{)'}how() why()'!mul(307#how()who();!&who()][mul(765,150)mul(819,139)'select(820,327),where()+from() how()?'mul(364,188)who(408,929)+who()}select()'who()who()mul(995,874)}$~/>;'mul(887,973)who()mul(993,239)where()^when()^,[#:mul(325,621)where()-;<}!where(448,355)(mul(953,77)select()#{$*%mul(124,72)?'mul(19,453)when()(/why()where()%mul(363,709$:what()!>{}who()mul(795,307)??how()[mul(18,31&[%select() $where())!why()mul(287,498)>-?*&when()mul(74,814>~why()when(),$(mul(185,120)mul(32,831)'why()mul(608,689);~#,who() how()~!mul(876,744)'from():){do()!]why(30,513)/who(876,41)from(254,279)mulhow()from()from()where()&mul(8,16)mul(329,708)?{~#{+why()why()@mul(334,310)!*who()mul(213,492)]mul(172,234)[}$,<) mul(533,937)mul(729,811){mul(176,287)%/-&/$what()from()-mul(657,961)&(mul(978,585)~]#'$mul(815,133)why()##where()~~where(){;mul(330,156)where()who(896,631)from()*what())mul(995,394)~(from(),'',(mul(146,412)}@:'from()mul(74,137)(#who()who()>where()*mul(711who();mul(393,823)(;mul(728,574)>/$mul(164,411)<who()how(870,24))how()&}mul*% select()%/>]@mul(667,120)#:@)mul(241,857?who()where()^:select()mul(874,315)+who()why()?;@'+when()don't()^select()from()#where()]{how(478,532):what()mul(882,399how()!from()@when()*where()from()mul(121,283);%#{($mul(59,76)from()$/mul(284,919)><$?/>mul(171,491)~mul(327,128)<)#how()[,'#}$mul(85,766)!{^why()from()%mul(201,803^*do()%]why()why()+why()]++mul(878,596)]mul(29,225)&,who()/where()who()who()what();mul(257,352)>'how()(-$,where(560,922)mul(169,577)!who(){what()select(){don't()#^mul(534,786)&&$mul(857,238)#@where()]mul(689,487))~[when()where()<?mul(222,741)!mul(385,811)*@-mul(767,740)%when()why()who()::#where()^mul(432,228)what()select():where()don't()how()<!;*when()}mul(672,806){<'(mul(841,126)how()mul(320,259)'}what()mul(268,877)from()}+)*'(>~mul(793,968)why()when()select()$,*mul(26,17)mul(20,863)$'$*#@how()#mul(696,339)select()-mul(28,879)why() /select()*mul(717,19)who(){']~]]#!/usr/bin/perlwhen()mul(367,171)
|
||||||
|
%when(651,576)}{]%+]mul(603,277)<{where()&$-'%mul(35,478)mul(272,670where(535,775)from()>}where()mul(435,668)>-select()@~}mul(917,854:/why() <~'~when(355,462)mul(124,375)@^*(<*[ don't()/who()/mul(945,697)where()mul(882,7){+mul(69,260)-how()<from()where(640,717)what()where()mul(83,864)mul(772,828)&<@:@mul(210,454)& (^~[%@mul(678,869)%how()~&+what()]/from()why()mul(672,452)#!who(355,256)<#what()(mul(152,659)?([@;select()where();do()what()select()(when()]mul(557,586)when(79,896)-^-how()^mul(290,50)select()<how()%%$what()#~!mul(711,368)<;!don't()+'mul@# select();[$where() ][mul(877,359)do()<what()#mul(545,361)where()what()'*why()where(){who()+mul(338,61)+where()?;'mul(233,835)*when();})?)&from(){do()!)mul(345,942)^mul(27,903;mul(169,778)select()^{[{ + ~mul(41,863)who()mul(392,367)<$why()< ? mul(27,423)-%mul(939,220)where()?why()%mul(808,712)^^;mul(276,164)mul(142,793)#+/{from()'?}mul/!from()mul(97,673)+@what()where()@^where()}mul(828,37)+>({#{mul(560,950)-}'mul<what()-why()mul(202,967) }from()why()where()}mul(255,593)where():* ){mul^['what()!! ;who()where()mul(835,370)-{]/mul(116,69)mul(731,20)'when(),who()mul(656,120)^select()?from()mul(760,137)!}from(398,469)where():;)what()%mul(536,801)$how()why()?who()*^%@+mul(402,84)~#&mul(299,585)$]&*;mul(137,876)<%-{how()where()mul(139,249)%+*}mul(367,25)/who(){mul(392,209)>where(),! ~%who()what()-mul(250,270 mul(47,151)&''[don't()]when(61,247)+%+-#when()mul(122,885))~:don't(),)[{mul(637,997)where()-mul(956,646)why()')#how()~mul(761,774)select():! ['mul(989,366)from()@how(941,580)]*':;[mul(963,704):mul@:$(why()^)mul(155,232):'what()!$%mul(300,251)(<@:<%how()^ +mul(375,864)mul(617,872),:;mul(175,906)what()@]@+{-why()+when(159,169)mul(711,500from()~[select()}when() &/>%mul(652,63)-!,!from()mul(519,182)'/-+$$where()mul(883,742)mul(454,250)$where()@mul(889,720)?>(mul(957,875)mul(675,759)from()/)(*>who(799,225)what()[mul(742,648)+{> >]{,>mul(391,737)mul(743,765)?[{where()&mul(759,385)from():]]:[,:$mul(305,875)!when();select()>what()#-#mul(483 [-mul(462,60)/$what()&}don't() !mul(238,876)what()~;@-!/$/mul(440,228)!<,^];$mul(668,60)+@when()/why()@mul(907,793)[from()-:mul(552,833) mul(921,276)from()mul(18,995)#{from()},what()>mul(71,909)#mul(166,313)^%what()^-* when()how()mul(26,404)mul(170,970)mul(917,165);mul(335,29)how()when(705,598)(+~~mul(614,118)&mul(281,780)how();&([#mul(27,176)]@%%!-)/~why()mul(813,915)select()&mul(895,899)#%~%mul(802,527)<'$where()how()what()^)why()(mul(962,93)-)%^why()how()mul(451,67)how()[)@[}where()#select()[mul(73,877),}*~~~mul(383,925)where()&where()how(197,895)#from()#$mul(813,528)[@who(),)-from()what()>from()mul(170,868)*from(995,971))~mul(835,419))mul(365,324)/mul(63,101)when()'~ %):how(){^mul(947,676)+@,where()where()~'?mul(635-/mul(612,440){'%(+}]]mul(775,628)&<mul(578,412)( do()mul(921,135)-]# {who()^<mul(75,976)}%~%):%:% mul(215,161){select())>;)#@/what()mul(825,859)& who()#)mul(491,748)}<,;mul(404,634)why()+select()*+'where()>:mul(681,804)why()mul(645,786)when()/what()&<;from()what();mul%[&+:$'mul(457,855)-when(840,583)why()mul(479,443)why()~mul!)!-}mul(29,976)-<!'/}>[+<mul(274,18)%])[%mul(893,678):,&select()when()mul(638,687)[+from()what()/{who()-> mul(23,723)'who()when()select()&>mul(976,72)@:[/;select()why()#>mul(47,803)($?^-%?%mul(145,548)!:?)+what()?select()where()mul(373,284)select()&)when(61,867)where()+>mul(910,263)'^!(<) (mul(99,989)
|
||||||
|
,mul(134,916)from()why()?;mul(414,211)from()where()}~&[why()^!mulselect() mul(123,66)@/mul(652<when()%^%how(),}mul(318,994)-# %^*&)mul(282,948)don't()~^'>mul(791,484)~#mul<;&select()what()-do()<+:']why()%mul(478,188)>* @^ #mul(162,677)/who() )/@)how()from()mul(919,612)why()what()^};^why()$;why()mul(9,232) #how()mul(413,460)> mul(254,330)!>~;mul(16,657)<where();what();$mul(150,998){mul(290,179)!- mul(607,707)why()select()*;{);who(226,887)mul(795,112)mul(383,996)-^:what(697,317){what()@?@mul(352,290)%>[}*what()]'mul(402,455)(mul(159,801)how()!/()mul(890,162):why();how()mul(177[! ^-@<from()select()}mul(91,452)[how()? *who() mul(834why(226,342){{<$~>mul(412,292)/[{mul(834 ~from()!;when()mul(943,547)'+;$:from()mul(820,501)how()+~who(714,864)mulfrom() mul(331,67);-$'mul(168,191)[*;&~how()/[what()what()mul(384,321)what()>@how()when()[-@<mul(365,727)mul(349,706)'who()]&-mul(528,940)when()(<]select()@}*(why()mul(85,882)[{-select()/mul(273,409)~mul(964,434)who()what()!from()>+,mul(914,214)/~mul(708,958)do()@+mul(106,731)*(where()what()where()>,where()mul(60,776+mul(487,915)from()&{;'what()^*mul(319,884)(}who()mul(328))when()*@ +mul(754,857)where(),+from()<mul(651,362)?;[/}@}when()mul(399,158)&@how();;mul(964,753)!^why()}when()]!{how()mul(525,209)who()^mul(869,719)- <>~><>~mul(207,721){:#how()what()when()?<+mul(107,805)^$%}from(),[,$[mul(375,736)mul(73,81)-$where()$-<<:<mul(588,899)who()&mul(902,680);?[ <)mul(715,138) how() +;mul(875,81)],;$!?(select()mul(669,19);!*%},!why()~}mul(90,643)]mul(969,823)}$@when()&where()mulwhere()<&%>:mul(435,179)when()/,how()&,)@mul(899(what()why()/;why()}])!what()mul(855,799)~{@where()why())where()why()don't();!~,mul(801,421)mul(688,282)from()?when()where()/$~'when()mul(799,579)[mul(589,929)*why(),[[who()from()/mul(422,435){{~,-mul(811,256)}why()--mul(284,323)$;?;from()when()/@!,mul(411,499)mul(712,633)?(#select(699,176)where()]why()[who()do()[-mul(252,327)mul(733,191)-why()+}when()$mul(575,854):--#?what()^,]>mul(710,364)<where(435,528);^ : how()mul(859,814)]+what()*) mul(173,667)?>:-'/mul(955,516)@who()+mul(765,740)when()@?+)!'don't()[-<mul(365,369)^who()why(511,407)-mul(532,507))mul(424,846)~from()from(828,590)-*]mul(86'>when()~[/ when()?; mul(65,78)}]<how()%+?why())mul(573,533)mul(729,878)*mul(520,776)where()from()!from()<@do()when()&^(who()/mul(945,626)% who();;(^+what();mul+why()}((where()>(-mul(268,76)/select()~:where(941,686)mul(936,336)-@mul(958,345)who(){~mul(548,108)!mul(951,331)[#?from()(^:%mul(843,813)$how();why():^why()+mul(594,381)select()when()from();]select()&:mul(765,515) /what()why())#)select()[mul(4,236)]%;^what()$@*do()&>mul^}'#+~*&where(721,403)mul(430,162)mul(54,147)%)'}$^where()}mul(823,311)mul(882,70)mul(869,503)@who():)&what()mul(383,271)~mul(568,286why(365,711)why(387,388)!)what()from()mul(867,166)where(243,478))?how()-@>@mul(191,472)}@&}from();^}[mul(45,832)->/what(705,241)(>what()]mul(85,192)&&]#-$#mul(498,712)@)when(),]mul(521,682)/how()}-}mul(366when()+,when()/mul(697,179) %(mul(412,215)$mul(798)^*mul(85,476),'how() +$;mul(423,624)where()mul(501from()@{who()-mul(457,671)~who()when()how(343,28)%where(675,997)*why()how(186,529)#mul(189,417),+[[@when()/mul(526,457))($+!*@mul(817,569))(- &%&/why()mul(909,493);mul(484,901);!$why()<^)~]do()'/mul(968,342)}*;mul(982,164)&>why()]>select()&[mul(364,498)mul(595,443) -who();{{?(~mul(33,531)who()who(455,309)*select()when()mul(367,411)who()what()?where()^mul(345,845)<@mul(376;who()[select()>*!how()do()#from())<(mul&from(128,233)how(){%when()mul(851,364)mul(494,714)
|
||||||
|
%{<<%mul(268,805))&#mul(373,10)!%};%,when():mul(628,215)&}& mul(322:?>^<when()>*,,mul(355,828);mul(939,916);>,where()][>)};mul(925,115)]mul(161,40) @ mul(234,412)[%%mul(414,812) when()*mul(326,103)-[({;/#/^+mul(810,213)don't()- {>who(){mul(527,352)@&')*when()]who()%mul(736,73)from()[(}mul(917,960)+,-%mul(945,466)~why(398,607),mul(198,701){'-(when(),*:[mul(822what()}]:>who(685,960)?mul(866,969) *#~when()mul(624,619)?<';what()()<$mul(582,429),@mul(112,480)'!mul(113,204)what()>$~%,$'*mul(909,964)?who()why()how()$mul(181,265)'mul(227,282)*>:+from()[how()%mul(534,756)]from()/mul(782,594)when(976,63):&,where(101,159)@$why()how()mul(949,569)how()why()where()what()}&<[{mul(984,451);#how()what()~#mul(976,666)~'what()mul(879,268from()when()mul(952,795){where()-&,%/select()mul(892,249)mul(562,394)do()-<how()-[ mul(682,68)select(){#what(390,528)from()!&$mul*%;%why()}[mul(641,891)'[mul(604,200)* <?;@~-<mul(32,446)#select()mul(367,881)who()}-+!@/mul%%how()how()mul(484,441)'!*-,why()//mul(232,705)>>),&(}'mul(624,35)mul(770,961);why()/;//+*mul(460,933)>%%@from()mul(913,510)from()@from()how()#mul(336,262)select()!what()%/select(){*!{mul(324,598)mul(520,239)/select()@ how()how()mul(9,679) &from()mul(132,603)where()mul(918,579)-why()'mul(379,960)^}#{/who(910,167)who(464,273)mul(225,34)where(){?#%why()[}mul(795,611)/mul(985,849)(mul(212,96)<;@from()mul(692,369)>mul(525,547)/who()-:<how()mul(715,343)when(488,771),'mul(303,170)where()>how()>:?%}}^mul(752,768)why()%mul(696,11) *)^/*!'mul(148,335)from()mul(485,796),,+>>'?do()+;select()?:mul(456,261)?!mul(43,918)~-)from(),}>)mul(960,664)' -{from()^,where()-what()mul(508,451)]+ {why()why()/%@/mul(176,657)select(488,126):'where()mul(247,928)/how()who():!mul(844,455)#<(&when()from()&*mul(898,677)from(){mul(766,841)mul(990,880)who()where()?;mul(487,623)from()why()[mul(163,74)select();$>select(190,549)do()<:+select(677,307)[(how()~]mul(328,574))#^)mul(767,737)mul(996,115);from()[from()mul(977,738))from()when()[mul(868,591)%what()mul(347,943)'-why()**#how()~mul(327,720)-;)-[#-~why()mul(71,877)-!select()/,'$'mul(741,845)[&^$when()}mul(686,640)&}why(323,972)'$[mul(352,2)&who()-+%$} mul(295,145)';]*when()$'<mul(777,684),where()]don't();what()%$?-+]/#mul(981,496)mul(402,419)what()*^what()mul(165,139)from()who()where(),how()select()from()%mul(376,689) mul(389,696)where()what(949,275)how()~who(600,641)'from()!#mul(436,525)~/[%-}^mul(489,872)select()mul(82,53)*select(70,72)*what()what()]:{from()%mul(433,905);+-mul(191,114);[from()mul(401,992)?'mul(257,949)**'/~why()*!mul(902,617)where()@]>}-mul(61,125)#mul(446,48)@~{*[*$when()who()who()mul(300,206)&+!where()mul(938,463)when()!&%where() &*;*mul(772,27)]&;how()!]how()do()/^$what()how()mul(305,773)>mul(216,395)':mul(291,15)*@what()(^mul(56,367))~,>mul(233,290)?&;who(333,171)what(370,12)$ ?mul(306,488)<^where()($mul(627,462))]select()':mul(565,994)~>mul(626,380)]}who(){mul(590,221)mul(684,793) who()/{%@(from()@?mul(448,580)from(856,317)!]why()from()&>[?mul(971,484)~mul(417,679)mul(33,70)^what()mul(816,623);@mul(735,657)
|
||||||
140
priv/inputs/day04/input.txt
Normal file
140
priv/inputs/day04/input.txt
Normal file
|
|
@ -0,0 +1,140 @@
|
||||||
|
SAMSXXMAXAMXSMXMMMSMSSSSMASMMAMMSMMMMMMMMSMSMSSXMAMXXXMSXSXSMSSMAMMXMSMMXSASMAXASMSMXMASMMMMSAMXXMAXXMMXAMAMXMSMMMMMMMMMMXSSMASMXXXXXMASXXAX
|
||||||
|
SAASMMASAXMAXMAMXAMSAMXMXASASMXAAAAAMSSMMAAAAXAAMASXSAMXMMAMXMAMMXSASAAAAMMAMMMMXAAMMSAMXSAMMASMSAMMAMXXXSXMAXAAASXAAASAMXMASASMSSSMMAMXMASX
|
||||||
|
SMMSXSAXMSMSXSASMSMMMSMSMMSAMMMSSSMSMAAASMSMSMSMMAAMSXMAAMAMASMXSASXSSMMXSAMXSAAMXMMAMASAMXSXXMAMXMASMMSMMAMMXXXMXSSSMSASXSMMMMXAXAMAASAMXMX
|
||||||
|
XMASAMASXXAAAMASAAXAXAAAAXMMAXXMAMAAMSSMMXAAAAMXMXXAMXSXMSXSAMXXMASAMMMSAMXXASASMSXSSXXMASASXMSXMAMAAAASAXAASXSMSAMXXASAMASXMASMMSMMSXSMMASM
|
||||||
|
SASMAMSMMMMMSMAMXMMMSMMMSXMSSMMMAMMMXAMMMSMSMMMAMMMSMMMSMXAMMSMAMMMMMAAMAMSMAXAMAAMXASAXXMMSAMAMXAMSSMMSSMSMMAAMMASAMXMMXXMAMAMAXXAAMMXAXAXM
|
||||||
|
ASMSMMMAAMMAMMAMMSSMAXAMXXXAAAMMASAXMASMASAMAXSAMSXMAAAAMMSMAAAMXMASMMSXAMXXMMMMMMSMAAMSXSMSXMAXSAMXXMXMMXXAMMMMSSMXSXAMSMSSMSSMMSMMSSSXMSSS
|
||||||
|
MAXAMAMMMSMAMMASAAASASMSXSMSMMMSAXMXSMMMXMASAMSMAMMSSMSMSAXMSSXMAXSXXSMXXSXAMXMXMAMMXMAAAMMMAMAMSAMSMMAXMAXAXAAAXAXSMXSMAAAMMAAAAXXAXMXAXAAA
|
||||||
|
XMSMSAXMXXMSXSASMSXMXSAMAXXAASAMAXSAMASMSMXMAMXMMMAMAXMAMXSAMAMSSMMMXAAMXMMAXAMMMSSMMXSMXMAXMMSXSAMAXXMSMMSMSSSSMMSMAAMSSMMXMSSMXMMMXMSSMMSM
|
||||||
|
XMAMAAMMMMXXXMAMAMAASMAMXMASXMASAXMASAAAASMSMMXMASXSXMMAMMAMXAXXMASAMMMMMMXMXAXMAMAAMAXXASMSXMXXXXMXSMXMXAAAMMAAAXAMMMMAXXXXMAXMASASAAAMAXAA
|
||||||
|
SSSMSMMAAXASMMSMXMMMXSAMAXXMAMAMMSSMMMSAMXXAASXMAMXXMAMAXSMSSMSAXMAXXMXAXSASXSSMMMSMMMMXXXXAMMMMSMSMSAAXMSMSMMSSMSXSSSMMSMSMMASMMSASASMSAMXA
|
||||||
|
AAAMAASXMMMSAAXMAAXXAXMSMSASMSSXMAMXMXMXXMMMMMAMAMAMXSSXXAAXXASXMXAMSMMMXMAXAAAXMAMASMSMSXAMAXAAAAAASXMMXAXAXXAXXXMXAAAASAXAMAMAXMAMXMMMAMXM
|
||||||
|
MMMMMXMAAXASMMMXXMMMMMMAMXAAAAXAMXSXSMMAXAAXXSASAMSAXXAMSMMMMMMMSSXMAAASMMSMMSMMMMSAMAAAAMSXMSMSSSMMMSSXXXSMSMMSMMMSMSMMSSSXMXSAMMMMXMXSAMAX
|
||||||
|
XMXAXMASMMASMMMMMASMSASXSMXMXMSXMXMXAAXXMMXSMMASAXMAMMAMMAAMXAAAAAASMSMXAAXAXMASAXMXMSMSMAMAMSMAMAXXAMXSAMAMAAXAAAAAXXXXXASXMASAXMSMMMAMAXXX
|
||||||
|
AASMSMMAMXAMAMAASXMAMMMAXAXMXXMASAMSSMMMAXMMMMXMXMASAMXMMSMSXSSMMSMMAMXSMMSSMSAMXMAMMAAMXXXAMXMASAMMXMAXMSSSSSSSSMSSSMMSMXMXMASXMMAAMMSXMMSA
|
||||||
|
SMMAAXSXAMSSMMSXSAMXMSXMMSMAAMSAMXXAAAASXSMAAXAASXAXASMSAMXSXAXAXXMASXMASMAMMMXSSMMASXMMASMMSXSASMXSAMMSXMAAAAXXMAMAAXAASAMXMASAMSSSMAMAMAXA
|
||||||
|
XXMMMMMASAXAXXMXXXMMAMAXAXAXMXMSSXMSXSMSAXMAMXASMMMSAMAMXMASMMXSMXXSXMXSXMASAMMAMAXMXAAMXMAAMAMMSXAMAMASAMMMMMMSMXSSMMSXSXSAMXSXMAAAMASXMSSS
|
||||||
|
SASXSXSAMXSXMASXSSMSASXMMSSMXAXMMMXMAMAMXMXMSXMAXXXMAMXSAMMMAXSXMXSMSAXXASAXAMMASMMXMSMMMMMMMMMASMMSSMASAMMSAAAXAAXAMXMASMSASMMAMMSMMMSAAMAM
|
||||||
|
SAMASXMASASMMASMAAAXXMAAXMAASXSAXMAMAMXAAMAAMAMXAMMSXMXAXMAMSMAASXAAAXXSAMMSSXSMSAAXAXAMMASXSSMASAAAAMMXXMAXMXXMMMXAMSAMXAMXMXMASAAAAASMMMAM
|
||||||
|
MAMAMAXAMASAXAMMSMMMSSSMMMMMXAMMAMASAMXSXSASXSMSASAAASAMXSASMXSAMSMMMSAMAMAAAMXAMXMMMMAMSASAAAMASMMMMSASMSSSMSMSAMXMMMASMXMAXSMASMSMMXXMAMAM
|
||||||
|
XSMAMXMSMMSAMXSAMAMSAAASXSSMSMXSXSASASAXAAAXAAASMMMSXSAMASXSXAXMASXAXMASMMMSSSSXMASXXXXMMASMSSMMMMSXAMASAAXAAAASMMAAMSAMAMSXMXMAXXAMSSSSSSSS
|
||||||
|
XXSSSMMAAMXMAXMMMAMMMSMMXXAAXXXXMMASAMXSMMAMSMMMXSAMAXAMAXAMMSSMMXMXXSAMXAAAAAMASAXXMASXSXXMAXMMAAXAMXXMMMSMMMXMASMXMMASMMXAXMMSSMMSAAMAXAXX
|
||||||
|
XMAXXAXSMMASXSXSXSXXMAMMXSMMMSMSAMAMXMAMXSXMXMAXXMASMXSMSSXSAAAMXMASXMXSXMMMSASMMMMXMASAMXMMMSMSMMXSXMAXXAAXXMSMMMAASXXMXXXMMXAMAXXMMXMMMMMM
|
||||||
|
AMXMSSMMXSMMMAAXAXXXSAMXAXAAAAAXMMXSASXAAXAMSMSMSMMMXAMAXAAAMMSMSMAXASAMXSXXMAMXAAAXMAMAMAMXAAXXASXXASXMMMSMMMSAAMMMSASMXSASAMXSMMSMMSMXSXAA
|
||||||
|
MMXMAAXAASAXMMMMXMAXMAMMXMSMSXXXMSXMAXXMXSAMAAAAXAAAXXMAMMSMMSMXMMMSXMAXAAAXMSMXMXSXMASMSASMSSXSAMMXXMSAAAXASASXMXSASAMXAMAMXSAMMAAAMAMAMMMX
|
||||||
|
MSMMSSMMMMAMXAAXMSMXSAMXMMMMMMMSMAAMMMSMASAXMSMMSXMSSMSXSAXXMAMMXAXXXMXMSSMSAMASXMMMSXSASASAXAMMSMXMSAXSMXSMMXSAMAMASMSSSMSMAMASMSSSMAMASXSS
|
||||||
|
XAAMAMXXSXAASXMSAAAXSAMXSAAAAASASXXMAAXMAXMMAAAXSMXXAAAAMXSMSSSMSSSMSSSMXAXMAMAMAAAASAMXMAMMMXMMXSAAMAMASAMXSXSAMXMMMMMAAAXMXMSMAMXXXXSAAXAA
|
||||||
|
SSXMAMMASXMXSAAAMMSMXAMASMSMSSSMMSASMSSMSSSSSXSASAMXMXMMMAAXAXAAXMAMXAAMSMMMXMAMXMMMMXXAMXMASMMXAXMMMMSAMSXMSASXMMXMAAMSMMMXMMMMXMASMXSMMMSM
|
||||||
|
AAXXSSMMSASMXMSMXXAXXXMXMAMXMAXXXSXSAMXAMAAAMXMMXASXMAXASMSMSSMMMSXMMSMMAXAXMMASAMXMSMSMSASMMASMMSMXSAMXSMSAMAMMXAAMSXXMXSSSMASXAMXMMASAXAMX
|
||||||
|
SSSXAAMASAMMAXMAASMSAXSMMAMAMMMMXXMMMMMAMMMMMXAMMAMASMMASAAAAXXAMXMMMMASXMMSASASAMSXAAAASXXAXSASAAMAMAXXAAXMAXMMSSSMXMAMAAAAAAMXXSASMASMMXSA
|
||||||
|
AAXMSMMMMMMSASMMMMASMMSASMSMXMASXMXAAAMAMAAAASASXSSMASMXMMMMMSSMSAAAASMMSAASMMAMAXXSMSMXMMSMMMMXMAXXSSMSMSMXSAAXAAXAXSXMSMSMMMSXXMASMASAMASA
|
||||||
|
MASAXAMXMMAMXXAMXMMMXASMMAMAAXXSAAMSSSXMSSSSMSASAMXMAXMXSMMXXXAASXSSXSXAMMMMAMXSMMMXMXXAXMASASXMSSXXAMASXXMAXSMMMSMMMSMAXAAMXAXAAMAMMXMAMXXA
|
||||||
|
XAAXMAMXSSSSMMMMMXMXMMSMSAMSMSAMMSMMAMMMAMXAAMXMXMSMMSSMAAASMMMMMAXXXXMMXSASAMXAAAXAMXMMMSASXXAXAASMAMAMMSAMXAXXXMXMASMAMMMMMXSMSMXMSASMMSSS
|
||||||
|
MMXXSAMXXAAXAASAMMXAAXMASXXXAAMSXAMSAMXMASMMMMSMXXSAAAASXMMAAAAXMSMSMMMAXSAXAMXMXMSMSSSMAMASMSMMMSMSMMASAMAXSXMASMAMSSMASAMXSMMXAXMXSMSXAAAX
|
||||||
|
AAAXAMXMMMMMSMXASASMSMMAMMMMSMXXAMXSAMXSAMMAAAAMSMSMMXAMXMAXSMSMMAAAMAMXXMSMSSSMSAAMAAAMMMXMAAMXSXMSMSXSXXSMMMMAAMXMAMMAMASASASMMMMAMXSMMMMM
|
||||||
|
MMXSASAMAXAAXXSSMMMMAMMXSXXAAXMMXMASAMAMAXSXMSMSAAXMXMSXMASAXMAXSMMMXSSXSAMXMAAAMSMMXSMMXSAMSMXXAXAXAXASMMMAXAMSSSXMXSMSMMMASAMAXASMMMSASXSM
|
||||||
|
AMAMMSMSSMMMSAMAAXXSAMSMXAMMMMAAMSXMAMXSXMMMAXMMMSMSXXMASAMXAXMAXMASAAMXMXMAMMMMMMXMXXXAASMMMMSAMMMMMMMMAAXXMMXAAMXMXAMMASMMMMMSSMXAXASXMAAS
|
||||||
|
SMXSAMXAAXAAAAMSMMASASAASMSSMMSSMAASMSXMMMAAMSAMXXASMASAMXXMXASXXSAMAMXAXASXXAXAXMASMSMMXSXMAASMXAXAAAASXMSMSMMMMMAMXMASAMXAAXMXAXSMMMSAMSMS
|
||||||
|
XAMMMMMSMMMSMSMMAXMSMMAMMAXMAXAAMSMMASXSXSASXMMMMAAXSMMASXMSMXMAAMASMXSMSAXMASXMSXMAAAASAMASXMXMASMXSSXXAAAXXXXAASAMAXAMAMXMASMSMMAAAASMMAAM
|
||||||
|
MSMSAXMMMSMXAMASMMXMXSMMMXMXSMMXMAAMAMAXAXSXMAAMXMSMXMSXMXAAXAMMMMAMMAAAMMMXAXXMAXAMMMXMSSMMAXMASXAXMXMSMSMSAMMSMSASMSMSXASXXSAAAMSSMXMAMMSM
|
||||||
|
MMAMASMAAAAMAMAMSAAXMXAAXXMAMASXSSSMSSMMMMMXXXMSXMMAAXMMMMSMSMSSXMASMMMMSMSMMMAMASXXSMSAMXAMXMAXAMMMMAMAAAXAAMXMAMXMXAXXMMMMXMXMMMAXMASMXMAM
|
||||||
|
MMSMAXXAMMMMXMAXMSXXASXMSSMXSAMXAAXAXSXAXASMXSXMASXSMXAAAAAAAXAMXMAXAAXXSAAASMSMAMAMAMMMMSXSSSXSMXSAAAMMSMSSXMAMAMSMSXMMAAASXSASMMSSSXSXASAS
|
||||||
|
MAAMXMMMSSSMASMXMASXMMASAAMAMAMMMMMMMXSSMMXAMSASAMMXMASXSSMSMMMSAMMSSMMAMXMSMAMMXMSAAMMSAMXAASAAXAMMSMSAMXXMXMASMMAAAMAASMSAAMAMSAXAMASMMSAS
|
||||||
|
MSSSXMASAAASASAXMASMAMSMXSMAXAMXXXAAXMXMASMSMSAMXMXMXXMAAXAMXMXMXSAAXXMASMXXMAMXMMMSXSAMASMMSMMMMMXAAAMXMXAXAMMMMSMSMSMMMXMMMMMMMMMAMAMXXMMM
|
||||||
|
AAXXXMMMMXMMMMXMMSMXSMAASXMSSMASMSXXSAXSMMAMAMMMSSSSMSMXMXXMAAASAMMSMXMSAMSAMXSAAAAXMMMSAAAXAXXXASMMMSMMSMMSXSAAAAXAXAMXMXMMXASAAASAMXSMMSAS
|
||||||
|
MMSMMXSAMASAXMSXMXAAXXMXAXXMAXMXAMXSAMXSXMAMMMMAMAAAAMAAXAMSMSMMSXXMAXSAMXXAMXMMSSSSMXAMXSSMMAXMASMXMXXMAAMSASMSSSSXSMSAAMXAXAXMSASAMXAAAXAM
|
||||||
|
XAAAMASASASASAMAXMMMSXXMXMSSMXMMSMMMAXXXASAMXAMASMXMMMSMSAAAAXXAMMSMSXMAMMSAMXSAXMAMMAMSAXMXXMMSAMXASMSSXSMMAMAMAXMMMMSMSSSSSXSAMAMXMSMMMMXM
|
||||||
|
MSMXMASAMXSXSASXMXSXSXXASXAAXXXAMAASMMMSAMXMSXSASMXSAMXXXXSMSMMSMASXXASXMAXASAMXSMAMXMSAMXAXMXAXAXSMXAXMAXAMSMSMSXXAAASXXAAASAAXMMSMMMXAXSAS
|
||||||
|
MASAMXSMSMMASMMAMASXMAXSAMSSMMMSXSMSAAAMAMAAAAMAMXAMXMAMSXXAMXAAMMMAXMMAMSSXMASXSMXSAMAMSMSMMMSXMMSMMSMSMSAMXAXAXAMMMXMMMMSMMXMXMAAXAAXSXSAS
|
||||||
|
SAXMSMMAAAMMMMSAMAMAASXMMXAXAAAMAMMSXMXSASXMMMMMMSMMMSAAXXAMXMSSMXMSMSAXMAMXXAMXMAMMASAMXAMXMAAASASMMXAMASMMMSMAMASMMSMSAXAMSSXMMSSSMSSMAMAM
|
||||||
|
MXSXMAXSSSMAAXMAMSXXMMAAXMMSSMXSAMASMMXSASXSMSASXAXAASMSMSSSSXAMXMAMASMXSASMMSSMMAMSXSXSXMMAMMSSMASMAMMMXMMAMAMASXMAAAASXSAMAMAMXMXMXMAMMMSM
|
||||||
|
XSAXMXMAAXXMSSSXMAASMSXMMAAMAMAMAMAMAXAXMSMAAXAXAMMMXSAAASAAAMAXSMAXAMSXSAXXMXAASXMMAXASXASXSMMAMSMMASXMMSXMSXSASMSMMMMMMMAMASAMAMAMASAMXAXA
|
||||||
|
MXAAXAMMSMMSAAMAMXMXAASXMMXSAMASAMMSMMMSASAMSMSMXXAMAMXMMMMMMXSASXAMMSXXMMMMXSSMMSAMXMMMSXMXSXMAMAASASASMMMXMAMASAXAXXSMMSMMXSXXXXXSASAXMSSM
|
||||||
|
AMXMXXSAMAMMMAMXMSSMMMMMASMSXSASASAMXAXMAMSAXAXAMXXMAXMSXAXASAXASMSSXAXAMXAXAMXMAMXAAAXXMMXXMMSMSSXMASMXAXXAMXMAMMMMMMMMAAAXMMMXSAMAMSAMXAAM
|
||||||
|
SASXSSMMXSXAXAXAMSAMMASMSMAMAMAMAMAXMMMMMMMMMMMSSMSSMSAMSMMXAAMAMAASAMSMAXSMMMAMMSSSXXXMSAXXSAAAAMAMXMMSMMSMSMMASXMSAXAMSSSMAAAAMXMAMMMAMSSM
|
||||||
|
XXMXMXASAMSSSXSMXSAMXAXMXMAMSMSMSMSXMMXAXAXAAMXMAMXAAMAMAMSAMXMMMMMMMXAXSMXAASXSAAMXMMSMMMXMASMSMMXSXMAAXAAXAAMASAASMSXXAAMXSMMXMAXXSXXSMAXA
|
||||||
|
SMMSSSXMAXAXSXAXASXMMSSSXMSAMAAAAAXAXSSSSMSSMSASAMMMMMAMAMXXXXXXXMAMMXMAMASXMMAMMXMAAAAAAAASAMXXXMMMASXMMSSSSSMMSMMSMXMSMAMAXAXASMXSAMXAMMMA
|
||||||
|
MAAAAXAMSMMMXXMAXSAMAMMMAXAAMSMSMSMMMMAAAMAAMSASASMSXSSXMXSXSAMASMSSXAXAMMMAMMSMMSAMSSSXMSMSASXXAAAMAMASAAAAAXAXXMAXXXXXAMMMSMMXAAXMAXXXSSSX
|
||||||
|
SMMSMSSMMAAMXAXMASXMASAMMMSSMXXXXAMAAMSMSMMSMMMSXMAAAMAASMMAAMSAMAAAXMMXXXMXMMMAAMAMMXXMMXMSAMASXSXSASAMMSMXMSMMAMXMMMSMSMAMAXSMMSMSSXMSAAMS
|
||||||
|
XXAXXMMAXMASXMSSXMMSXSAAMXAXMMSXSSSMSXXAXMAXAXXSAMXMXMXMMAMMMXMAMMXMASMMMSXXSASMMSSMXMMXSAMMAMAXAMXAXMASMAXSXSXSXMAAAMAAAMXMSAXAAXAMAASAMXMX
|
||||||
|
XMAXASMSMSMXMAAMMAXSXSXMAMMMXAMXMXAAXMMMMSASAMXXAMMSASAXXAMXXMASMXMXAAXSASMMSAMSAAMAXAMASXMSXMASMSASASAMMMXSAMMSASXSSSMSMSMSAMSMMMSSMMMMXAAM
|
||||||
|
AMXSMMAMAASAMMMSSSMMAMXMAAMSMXSASMMMMAXSAMXSMXXMAMXXASMMSSSXMASASAAMSSXSSMXAMXMMMXSMSSMASMXXMXMAMAAXMMASMMAMSMAMAMXMAXAAMAXAMMMXXAAMAXXXXMXX
|
||||||
|
XXXAXMAMSMSMSMSAAAAMMMASMXAAAXSMSAMXSXMMMSMMMXMMMSSMMMXAXMAXAMXASXSAMXMMASMSSXXXXXAMAAMXMASMSAXMASMMXMXMAMXMXSSMSMMMAMXMSXSMXMXSMMXSSMMMAMMS
|
||||||
|
AXMMMMSXXXMMAMMMSSSMASXSAASMSXMASAMXXXMMASAAMAMSAAXAAAMMSXAXMSMAMAXXXMASAMXAAXMASMMMSSMMMMMASMSXMAMMXMMSXMXMMAMAMXXMMSMMMAMXSXAXAXMAXAASASAA
|
||||||
|
SMSXMXMASXXMASXXMMXMASAMXMMAMMXAMAMSMAAMXSMMXAXXMMSSMSAASMMSXSMMMMMXMMAMMSMMXSAMXAXMAXMASAMXMAMMMAMSAMAMAMAXMAMMMSMXAXAASMSAMMMMSMXSMMMSASXM
|
||||||
|
MAAASAMSMMASXSMXXMAMAMXSXMMXMAXXSXXAAAXSASXSSMSXXXXXMMMXSAMAMXAXXMSAMMXXAAAMASAMSMMMAXMASMMAMXMASAXSAXSXXMAMXSMAAAAMMXSMSAMMSAMXAMXMSMMMMMAX
|
||||||
|
MAMMMMMMAXMSASXSMMSMSMMMASXMASXMAMXASAXMASAXAAAXXMXMXXAAMAMAAXSMMASASXMMSMSMMSXMASXMXSXXMASMMMSASMXMMMMAXMSSMAXMXXSASAXXMXMASAMMMMAMASXAMSSM
|
||||||
|
MMMSAXASXMXMAMMSXAASAAASAMAAXAXAAMSXMASMXMASMMMMMMAMAXMSMMMXSAAXAMMMMMAAMAAMXSXSMASMAMAMAMAAXXXMXMMMMAXSMMAAMMXSMMXAXASXAXMASXMASMXSASXSMAAM
|
||||||
|
MAASMMMMAMSMSMAXMMMSSSMMXSMSMMMSMMAMXXAMAMXMAAXAASASXSMMASXAMMMMSXAAASMMSSXSAMMMMAXMASAMAAMMMMAMMAAAMMXMAXXMXXAMAMMAMSAMXMMXSXMASAXMAMAXMXSM
|
||||||
|
SMXXMAXXMSAAAMXMXSAMXXASASXXAAMAMAMAMMMSAMAMSMSSXSMXAAASAMMXMASXMSSMMSXXXXXMASAAMASMMSMMXSXMASAMXSSSSSMSAMXXMMMSAMMSMAAMAAAAXMXAXMSMSMMMMAMA
|
||||||
|
XMSMSASAMXMSMXSAMMAMXSXMAMASXMMMXAXMXAXMMMMXMXXMASAMSMMMSXMXSMSAAMMMMMMXMMXMASXXSAMXXXMMMMMSAMAXXAMXAAXMAMSMMMASASAXSMMSSSMMSAMMAAAAXAMAMMSM
|
||||||
|
SXAAXMAXXAMXAAMAMSMMXXXMAMMMASAMSSSMMSMXSAMAXMXMAMMMXAXAXMSMMXSMMMAAAMAAMAMMXSXMMMSMMAXXAAXMAXSMSASXMMMSSMMAAMMSAMXMAXMAMXAAAMASMSMSMMSMXXAM
|
||||||
|
XSMSMSSSMMAMMMSMMXAXMSMSAXAXXMAMAAAXAMXASASASXXMMSXMSSMMXXAXXAMAMSSSMMSMMSASAMXXXASAMXMSMSSSMSMAMXSAXXAAMASXMSMMAMSAMXMASMMMMSMXAXXAMXAMXMAS
|
||||||
|
MMSMAMAAAXSXAXAXAXXMMAMMSXSSSSXMMSMMMSMMSAMXMAAXMAXAAXAAMSMSMSSSMAXMAXAMXMMSAMASAASMMSAMAMAXMAMMMMSAMMSMSAMAAXXXAMXXAXMMMMXXXSAMXMSSMSASXSMM
|
||||||
|
XSAMAMSSMMMMSSSSSMMASASAXMAMXAAXXMAAXSAMMMMSMSSMSAXMXSMSMAAXXAAMMMMSMSASAMXSAMASMAMAAMAMXMAMSASXAASAMAMXMXXMMMXSASXMAXXAAMMSXSAMXMXMXMXMAAXS
|
||||||
|
MSMMXMMXMASAXAAAAAAMSASASXSSSMMMSSMMXMASXAAXMAAXMMSXAMXAMMSSMMXMXMASXSASMSXSMMXSXMMMMSSMAMSMSMSMMMSAMXSSMSMSAAAAXMMMASMSMSAAAXMMXSAMSSXMXMMS
|
||||||
|
ASXSSSMMSASMMMMSSMMMXMMAMAAAASAXMAMXMXAMMMMSMSSMAMXAMXMSSXAAAAMSMMASXMASXSMMMSMMASAAXAMMXMAMXAMXMASAMAMXAAXSAMMMAAXMASXMASMMSMSAXMASAXXMMMAX
|
||||||
|
MMMMAAAMMMSMAXAMXMXSXMXXMMMMMSXSSXSMXSASXSXSAAXMAAXMXAAMAMSSMMMAAMMSXMXMAXAAAAAXAMAMMMSMASASMSMSMXSSMXSMSMMMMSMXMAXMMMAMXMAXXAMASXXMMMXXAMSX
|
||||||
|
SASMSMMMAXXXMSMMMMAXMMMMMMAMXSXMMMMAMSXMASAMMMSSSSSMASXXAMMXASMSSMAMXSMMSMSMSSSMSSXMASAMAMAXAMAMXXMXXXAAMXSMAAXXSMSMSMXMASAMMSMMMMAMXAXSMSXS
|
||||||
|
SASXXMXSXMXMMAMAAMMXSAAAAMMSASASAAMSMMAMXMMMMXXAAAXMAMASMMXMASAAXMAXXSXMAAAAAAXAXAASXSMMMSSMMMAMSASAMSMMMASMSSSXSAAAAMMSMSASXAXAXMXMMSMAXAMX
|
||||||
|
MAMAXSASMSAXMAMXXAXAMMMSXSAMASASMSSMAMSSXSMAMMMMMMMMMMMAMXSMAMMMMSMSMXASMMMMMSAMXXMMXXXXMAXAASAMXMMAXXAAMAMXMXMAMSMSMSAAAXAMMMSMSAMXMAAMMSSS
|
||||||
|
XSAMXMASAMASMXSMSSMMMSAAXMXMAMAMXMAMAMXAAMSAMAXXAAMAAMXMXMMMASASMSAAASMMSMXMXMAMSAXXXMMSMXSSMSAXXXXXMXSAMSSMMAMXMMMMMMXMXMSMMAAAAXAMSXSXMMAM
|
||||||
|
AMAMXMSMMMSMXAAASMAMAMMSMMMMXMAMASXMMSMMMMSMXSASMSSMXSAXAASMMMASAMSMMXMASMXMASAMXAMXAAMAMXAAASAMMXSAAXAXAAAASAXSMXAAAMXSXXMAMSSSMXSAMMMAMMAM
|
||||||
|
XXAMMXXMAXAAMMMMMASMXSAMASAAAXXSAXAAAAXAMAXMAXMAXMAMASASXSMASMXMXMXMAXMAMSAMMSAMMSSSMSAMXMXMAMASAAXMMMMMMSSMMXXAXSSSMSASMMSAMXAAAXMXSAXAMSAM
|
||||||
|
MSSSSMXSSSMXMASXSSXMXMASAMMSMMAMXXSMSSSSMMSMMSSXMSSMMMMAMAMAMAMMMMSMMXSMXSXSXMAMAAAAAAXXSAMXXSXMMSMXAAXAXMAMAXMMMMMAAMXMAMAMXXXMXMXMMMSMMSSX
|
||||||
|
AXAAMAXAMAMXMMMAXMASMMAMXMXAMASXSMMAXAMAAXMAMAMAMXMAXXXMSSMMSAAMAAAAXAMXMXMXMSSMMSSMMMMMMSASMMMSAMXSSXMAXSAMMSAXAXMSMMMMMMSSSSMSSSMSAAAMMMXS
|
||||||
|
SMMSMSMXMXXMMAMMMMMMMMSSMSSSSMXAMXMXMMMXSMMSMMSXMAMXMXMXMAAXSXSSMXSSMMSAAAAAMMAAMAMXXXAAAXSAAAAXXXXXAAASAMXSAMMSMSXAXSXXMAMAAXAAAAASMSMSAMSA
|
||||||
|
XSMAAASAMMMMSASXMASXXAXAAXAAMXMSMXSXMASAMAAXMXMMSMSXSAAASMMMMXMAMMAMAASXSASXXMAMMSSMSXSSSSMSSMSSMSAMMSMXASMMAMXAAMAMXMAXMAMMMMMMMMMMXAMMASXX
|
||||||
|
SMSMSMSXXAAMMASMSASAMXSMSMSMXSMAMXMASAMXSMMSMAMAAAAASASASMMAMXMAXMASMMXMMXMASAAMAXMASAMXMAAAXMXMAAAMAAXMXMASAMSMSMAXAMAXSXMXMAXSXSXSMSSSSMMS
|
||||||
|
AAAXAMXMMSMSXASAMASXAAAAXAXMAXMASASAMASXSXMAMMSSMMMMMXMMXXXAMXMSXSAMAXXAMAXAMMMMXSMAMAMASAMXSXAXMSMMXSXSXMXMXXSAXMASXXAXMASMSSXMASAAAMAMXAMX
|
||||||
|
MSMSMSAMXMAMMMMAMAMXSSSMMMMMSSSMSAMMSAMMSASXSMAXXSMSSMMXSSSMXSAMAMAMAMMSMMMMMMAXXMMASAMMMXSSSMMSAAXSAMAAXMSSMSMMMMMSMMSXSAMXAAMMSMSMMMMMSXMS
|
||||||
|
XMAMASXMAMAMMXSSMASAMMAMMMAMAAMAMXMAMASASAMXXMASAXAMAAXXAAAAMMAMMSSMASXMAMXXAXXXXMSASMSAMXSAMXMAMMSMAMAMXXAAMMAAAAAMMAAAXMSMMMMMAAMXXSXAMMMA
|
||||||
|
MMAMMSAMMXXMXAMASXMAXSAMXSMSMSMSMSMMSAMAMSAXMSAMXMSSSMMMMSMMMMSMXAAMAMXSMMXMMXMMAXMASMXMASMAXXMMSMXMXMSMSMSSMSSMSMSXMMSSSMMMXAAXMAMAMMMMSAXM
|
||||||
|
XSXSASMMSSXMMMMAMSSMXMASAMASMMAAAMAXMXSAXXMXXMXMXMAXAAMAXXMASXMAMMMMASXMXASXSAAXXMSXMAXXXXMMMSMMMXMMSXXASAAAXXAAMAXMMXAMXAASMSMSMXMAMSAMXXAX
|
||||||
|
XAAMASXAASAMASMMSAXMASXMAMAMAMSMSMSSSXMMMMSMSMSMXMASXXMSMMMMSASXMSASAXAAMXMAMXXAAXMASMMMXMAAMXMASMMASXMAMMMSMSMMMAMAMMASXMMSAXAXXMMAXMASMAXM
|
||||||
|
SMXMXMMMSSXMASAMMMXXASMSAMASXMAXXAAAXXXAMXAAMAAMSXMMAMXAXASMSAMAASAMMMMMMAMSMAMSXMSAMAXSASMMMAXMSAMASXMAMAXAMXXMMMSXMSAMXMMMMMSMMMSMXSAMXAAA
|
||||||
|
XMAMAXSXMMMSXSMMMXSMXMMSASXSMSSSMMMSMSSXMAMSMMMSMASMMSSXSXMAMXMXMMMMAAXASXSAMXMMAXMASAMMAMXASXXXSXMAMAMASMSSSXSXAAAXXMMXMAAAXAXAXMAMAMXSASMS
|
||||||
|
XXAMMSMASAAXXMASMAXXAMASAMAMXXAMXXMAAMAMXXXAMXMMXAMAAMMMMXMSMSSSSSMMSMSAXXSMSXMSXMSXMASMAMXMASAMXAMSSSSXSAAAXAASMMSSMAMASXSSMSXXMMAXXSSMAMAA
|
||||||
|
MSMSMAMAMMXSMXXAMXSSMSAMAMMMMSMMMSMMMMAXAMASMSMMMSSMMSAAXSXAAAXAXAAMAMMMMASXSMXMAMSMXAMMAMMXAMXMSXMAAMMMSMMXMMMMXMAAXAMMXAAXAXSSMSXSAMXMAMSM
|
||||||
|
AAAAXAAMXSMAXSMMSAMMAMASAMAAAAAAAAAXSSMMXSAMAMAMAMAMAMMXMXXMSMMMMMMXAMAAMXMAMAAMMXMAMASXXSAMSMAXXXMMMMSAMAMSMMAXSMMSMXXXSSMMSMMMAAAMMMXAXMXS
|
||||||
|
SMSMSXSMASXSMSAXMASMAMASASXMSSSMSMSMAAXSAMXSXSAMXSAMMSMSMSMMAMAXSXMMMMSMMXMXMSSMMAXAMXAXMXMMXMXMXAMXXAMASXMASMMSMAXXMSAAAAXAAAAMMMMMXAXSXMAX
|
||||||
|
AXAXAXMMMSAMASXMSMMXMSMXXMMAMAAAAMMMXSAMXSAMMSASMSAXAAMAAAASMSSSMAAAAAXMSAMAAXAASMSSSXSXSAXSXAAAXMSAMXMXMASAMXMAMMMSAMMMXXMMSSMSMMSSMMMMAMAM
|
||||||
|
SAMMMXSAMMMMXMMMMMAAXAAMSSMAMXMASXSAMXAMAMASASXMASAMSSSMSMMXXAMAXXMXMSSMSASMSMSMMAAAXAXAMXSXASMSMMAXXXASMXMASASXMSAMXMXMMXSXXMAAMXXMAAAMAMAX
|
||||||
|
XAXMAAXASXXMMXSXAMSSSXMXAASMXAXMXMMMMSAMXSAMMSSXXMAMAAXXMXSSMSSSMSSXMXAXSASAMXXXXMMMMMMSMSMMMMMXAMAMXMXXAXSMMMMMAMMXAMAAXMMMAMSMSMXMSMSSMSMS
|
||||||
|
SXMMMMSAMMSXAAAXMXAAMASAXMMSSSSSXSXMAMAMXMMSAMASXSSMMSMXSAMAAAAXAAAAMSMMMMMASAMXMXSASAAAMAAAMAXSSMAMXSMSAMXAAXAMXMXSAMXMMAMAMXAMAAAMAAXXAAXA
|
||||||
|
XAXXAAMAMAASMMSAMMMAMMMSAAXXXMAXAMSMXSXXXMAMASMAXSAMXAAAMAXMMMSMMMSSMAMAMAMSMMSSMMSASMSMSSSMMMMAMMSMMAASMXXSXXMSAAXXMSASMSSMXSASXSSSMSMMSMSM
|
||||||
|
SXMMSXSAMSMAXAXMXAMMMAAXSMMMAAAMXMAXMAXMAMASXMXMMXSXSMSMSSMSAXXAAXAMMASXSSXMAMAMMAMAMXAAXAAXASAMMAMASMMMXSMMXSAMMXMAXSAXAAAMMMXMXAAAAAAAAXAX
|
||||||
|
SAMAXXMXXASMMSSMSSSXSMMXXXASXMXMXMAXSAMMAMMSAMAASAMXMAXXAMMSAMMXAMXXMXXAAXMXAMASXSMSMMMSMSMMMSASMAMAMXMAMXAAAMXMAXMMMMAMSMMXSMASMMMMXMMSXSXS
|
||||||
|
SAMAMSSXSASXAMAXAAMAXMMMASMSXMASAMAMMAMSSMAMASXMMAXXMASMMSAXAMSASMSXMMMMMMXSXMMAAXAXAAAAXMXMXMAMMSMSMSMAMSMMSXXMAMMAXMAMXAXAXSASAASAMAXXASMS
|
||||||
|
SAMMSMAAMAMXMXAMMSMMMSAMXAMXASASASXXMXMAXMAXMMAXSAMSMMMAXMASAMXAMAMXAAXAAXAAXMMXMMXSMMXXMMASAMAMMXAXAMSAMXASXXSSXXSSSSSSXMMSMMSSMMSAMXMSAMAS
|
||||||
|
SMMMAMMMMMMSMXSMAAAAAXXXXMASXMAMXMAMMMMMSSXSSSMMMMSXAASXMAMXAXMMMSMSSMSSMSSMMXMAXXXMASXSMSASXSMSMMAMXMMMSSMMMAXAAMAAXMASAXAXAMASAXSAMSAMAMAM
|
||||||
|
XXMMMSXMAMASAAMMXSSMSSMSXSASMSMMSSMMAAAMXMXMXAXXAXSMSMMSAXXSMMMSAMXXXXMAMAMXAASMXMAMMSAAAMASAMXAXMXMSMSMAAXAMMMMSSMAMMXSMMXSXMASMMMAMSSSSMSS
|
||||||
|
MXSAMXXXMXMMMMSAXAXAXXAAAMAMAAMMAAASMSSMASMMSMMAMXMAXXMASMMAMAXAASMMSAMXMSSSMMXAASXMAMMMMMSMMMSMSSMXMAAMMSSSSXXXAAMXSMMMAMXMMMASXMSSXMASAAXM
|
||||||
|
AAMXXMMSXSAAXMMMMAXXMMSMSMSMSMSMSMMMXAAXAMMAXAAXSSMSMMXMAXSAMXSMXMXAAAASAMMMAAMSMMAMXSXSXXXMXMAAAXAAMXMXXAAMXMMMSSMASAASAMAMAMAMAMAMAMXMMXMM
|
||||||
|
SMXXAAXAAMXMMXAMMXMMSAMAXAMMAMXXXMXMMXMMMSMASMSMAAAMAXSXMXSXMAAXMASXXSMMASASMMMMASXMXSAMXMMMASMXMSSMSAASMMSMSSMXAAMAMMMSMSASXMMSMMASAMXXXMAS
|
||||||
|
XXAMSXMMSMSMXSAXMAAMASMAMMMXMASXMASMXSMMASMMMAAMSMMSXMXAMAXMMMSMMMASXMXSSMASMMSXMASXAMXMAAASASXAMXMAXMSMAAAMXAMMSMMMSSMMMSMSXXMAMSASASMSXMAS
|
||||||
|
XMMXMAXAAAAAXSXMSXSAMXMXMSXMASAMXAMAAAASASAMXSXMXAASMSSMMAMAAAAMAMXSXMASMMXMAAMAMAMMMMAXXXMAASMAMAMXMSMMMMMMMMMAXSAXAAAAXSMSAXMAMMASAMAMMMMM
|
||||||
|
XAXASAMMSSMSMMMMMMXMXMASMMASXMXMMSSMMSMMASMMMMAMSMMSAXXXAMASXSMSMSMMMMMMXMAMMMXAMAMASXMSSMXMXMASXAMXMAXXMSASAXMASASMXSMMMSASAMSSMMAMAMSMASAS
|
||||||
|
MMSAXSAMAMXMAMSAMAASAMXSASAMSMAMAMAXMAXMXMXAAMXMAXXMXMSSSSMMAAAXAAAAXAASXMASXSSMSAXAMAMAXMASAMMXSSSSSMMMXSASXXMXXMXMXMASXMMMAMAMAMXSAMASXSAS
|
||||||
|
MAMXMXMAXXASAMSASXMSXMASMMMMAXXMASAMSMMSMSSSSSMMXSXAXXXAASAMSMMMSMSMXASAMXMAAXAXSAMSSMMSSSMSXSMAAXAAXMASMMAMAMSSSXAMASAXMSSSSMASXMAXASAMXMXM
|
||||||
|
MXSXMAAMMSMSAMMAMMAMXMAXXAAMMMXSMMMXXAASXMAAMAASAMMSMMMMMMXMXXMMMAAXMSMMXAMMMSMMSAMXAAXMAAASAMMMMMMMMSMSAMAMMMAAASMSAMXMAXXXASASMSSSXMASMMSM
|
||||||
|
SAMASAXSMAMMXMMAMMMMSMMXSXXSAXMAMXXMMMMSAXMMSSMMASAAAXAAAMSMMAMAMMMMXMASMXXSAMXASAMSXMMMSMMMAMMMMMXSASASMMAMAMMSMAMMXSAASMMSMMXSAAAMASAMAAAS
|
||||||
|
MAXMMMMMXAXMAMXASASXSASMSAASAMSAMSASAXASXMXXAAAMAMMSXSXMMXAASXMASAXSASXMASMMMXMXXAMMASAMAXXSXMAAAMMMAXXSMSSSMSAMXXXAAXASAAAAXAAMMMSMXMMSMSMS
|
||||||
|
SAMSASASMSMSAXSAMASAMAMAMMMMMMMMMSASAXAMXMASXXMMSSXXASXMSSSXXMSASXASAXXAXXSAAMSSXSMMXMASMMXMXSSSSSSMSMXMAXXAXAMXAAMMSSSXMMSSMMXSAXAAAMAMAAXM
|
||||||
|
MAASAMASAMAMAMMXMXMXMAMXMXAMXAAAXMMMXAAAASMMSAMAXAMMXMASAAMAAMMASXMMSMSSSXSMXMAAAXXSMSAMXSAMMXXXAAXAASXMAMMSMSXSXAXAAXMAMMAMMSASXSMSMXAMSXSA
|
||||||
|
SSMMAMAMMMXMSMMASAAMMXMSSXMSMMSXXAAAASAMXXAASXMMSMXAAXXMMSMMXMMAMMXMAMAAAAMXSSMMXMAXXAMXAXAXAXMMMMMXMXMASMXAAMAMMMMMSMSAMMASASXSXSAAXSXMAAMA
|
||||||
|
AXMMAMXXMXSAMAXAMMXMMXMMSAXAAXAXXSMXXAMXMSMMSXSXAXMSMSMMAXMSMAMMSXXSSMMSMAMAMAXAAMMMMMXMMSSMMMXAAXMMXASXAXSMSMSMAMAAAMAMXXMMMSAMAMSMMAMMSSMA
|
||||||
|
SMMSASXAMAMAMSMSSXSASMAASXMAMSAMXMAMXXMAMAMMMXMXSXMAXAAMASAASAMSXMAXAMXMXMMXSAMSMXAAXXMXMAXXXAMSMSAMMXMMMXXMAAXASMMXSASMSSSMXMMMAMAMSMXAAAXA
|
||||||
|
AAAAAMXXMASAMAXMAMSAXMMMMMXSMAMMAMAMASXSSXSASXSAMASASMSMSMMMSXSXAXSSMMAMASAAAAXXAASXMAXXMASMXSXAASAMMMMAXMASMSMMMMMAMXAAAAAMXXAMASAMXXMMSSMS
|
||||||
|
MSMMMMXMSXSASXSMSMMSMSSSXAAXMASMXXSMAMSAMXSASAMASMSXXAXXAASXXXXXXMAAXMXSAMMSSXMXMAXAASMXSAMXMAMMXSAMMAMMMSAMXMAMAAMXMAMMMSMMSMXXXXXAMXXXXMAM
|
||||||
|
XXXAAXMAAASAMASAXMAMMXAAXMMSSMSAXMMMMSAMMAMMMMMMMXMAMSMMMAMAMASXMSXMMMXMASAMMMMXXAMMMMAMXMSAAAXMASAMSXMSAMXSXMASMSXMMMMMMAMAMASMSSMSMMMAAMAM
|
||||||
|
SMSSXMAMXMMMMMMAMMSSSMMMSXAAAMXMXASAMXMXMAXAAXAMXAMXMAAAXMAMMAXXAXAXAXMXAMMMAAXAMXSAMXMMAXXXSMSMXMAMAMXMASXAXMASXXXSAAAXAAMAMSMAAAAAAMSMMMAM
|
||||||
|
XAAAAXSSMMAXMMMSMAXAXAAAXMMXSMAXXMMASMXAXSSSSSMSSSSMSSSMSMSSMXSMSMMSMXSMXSAMSMSMSASASXMSXSMMXXAMSSMMMAAAXXMASXMSAMASMSMSSXSAXAMMMMMMXMAASXXS
|
||||||
|
MSMSMMXAASAMXAAAMXSSSMMMSXAAMMMSSXSAMXSXMXAMXMAMAAAAAAMAMXAAMAXAAAXAAXSAMMXXAAMMMASAMAASASMASMSMAAASXSXSMMAAAAMMXMAMXMAMMASMSMXXAXASXMMSXAAA
|
||||||
|
XAAAMXSSMMXMSMXSSMXXXAAAXMMMSAASAAMMMASXMSAMXMAMMMMMMSMAMMSSMAMSXSSSSXSASMSSMSMAMXMMMMMMAXMXSAXMMSMMAMAAAXSSSSMASMSMMSSMMMXXAXMSSMMMAXXAXMAX
|
||||||
|
XMMMMAMAXMAMASMMAMSMMSMSSMSASMMXMXMAMASAMXMMASMSMMASAXXMXXXXAMMMAMAMAMSMMMAAAAMMSSMAMXXMMMXAMAMXMAMMAMSMMMMAAXMXSAXMMAAASAMMXXXAAASMMMSAMXMA
|
||||||
|
XSMXMXXAMXXSASMSAMASXAXMAXMXSXXMSMSXSXSMMAXXASAAASAMMSMSAMXMASAMXMAMAAXSSMSMMMAMAASASMMAAXMMMMMASAMXXMAXAASMSMSAMXMMMMSMMAMXAAMMMMMAMXMMAAMA
|
||||||
|
XSASMSMSXXXMAXXMASAXMASMXSXAMMSAAAMAMAMXSSSMAMMMMMAXXAAXMAMSAMASXSSSSMSASAXMSXSMSXSXSASXMMMXAXXXSASAXSASMMSAMAMXSSXMAXAXMMMSMSXAXMSMMASMSAMX
|
||||||
|
MMAMAAAAMSXMSMXSAMAMXMAMAMMAMXMMMSMAMAMXAAXMXMXSSSSMSMSMMSMMASMMMSAMAXMAMMMMMAAAXASXSMMASMMMSSMASAMMMMMMMAMAMSMSXMASXSSXSAAAAAMMSAAASXMXMASA
|
||||||
|
AMAMSXMASMAAXAAMXMMAASXMASXSMXMASXMXSXSMMXMXAXXXAAXAAAXXAAASAMMAMXAMSAMXMXAAMXMMMAMXMASAXXAAASMAMXMXAAAAMXMXMAXMASAMAAAASMSMSAAAAMSMMAXXMASX
|
||||||
|
SSXMXASMXMMMMSMXXMASMSXSSSXASXSXSAMXSMXXXXASASMMMMMSMSSMSSMMSSSXXSAMXMASMSSXSAXXMXMMSMMMSSMSSMMSSXSXSSSSSXMASXXSAMSSMMMMMXXAMXMASXMXSSMMMXSA
|
||||||
1386
priv/inputs/day05/input.txt
Normal file
1386
priv/inputs/day05/input.txt
Normal file
File diff suppressed because it is too large
Load diff
84
test/advent_code2024/solutions/day03/day3_test.exs
Normal file
84
test/advent_code2024/solutions/day03/day3_test.exs
Normal file
|
|
@ -0,0 +1,84 @@
|
||||||
|
defmodule AdventCode2024.Solutions.Day03Test do
|
||||||
|
use ExUnit.Case
|
||||||
|
alias AdventCode2024.Solutions.Day03
|
||||||
|
|
||||||
|
describe "solve/1" do
|
||||||
|
test "returns error for empty input" do
|
||||||
|
assert Day03.solve("") == {:error, :no_input}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns error for invalid file" do
|
||||||
|
assert Day03.solve("priv/nonexistent.txt") == {:error, :enoent}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "handles single valid multiplication" do
|
||||||
|
input = "mul(2,4)"
|
||||||
|
assert Day03.solve(input) == {:ok, 8}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "handles multiple valid multiplications" do
|
||||||
|
input = "mul(2,4)mul(5,5)"
|
||||||
|
assert Day03.solve(input) == {:ok, 33}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "ignores invalid multiplication formats" do
|
||||||
|
input = "mul(4*mul(6,9!?(12,34)mul(2,4)"
|
||||||
|
assert Day03.solve(input) == {:ok, 8}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "solves example from README" do
|
||||||
|
input = "xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))"
|
||||||
|
assert Day03.solve(input) == {:ok, 161}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "handles numbers up to 3 digits" do
|
||||||
|
input = "mul(123,456)mul(1,1)"
|
||||||
|
assert Day03.solve(input) == {:ok, 56089}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "ignores multiplications with spaces" do
|
||||||
|
input = "mul ( 2 , 4 )mul(2,4)"
|
||||||
|
assert Day03.solve(input) == {:ok, 8}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "solve_part2/1" do
|
||||||
|
test "returns error for empty input" do
|
||||||
|
assert Day03.solve_part2("") == {:error, :no_input}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns error for invalid file" do
|
||||||
|
assert Day03.solve_part2("priv/nonexistent.txt") == {:error, :enoent}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "handles single multiplication with do/don't controls" do
|
||||||
|
input = "do()mul(2,4)"
|
||||||
|
assert Day03.solve_part2(input) == {:ok, 8}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "respects don't instruction" do
|
||||||
|
input = "mul(2,4)don't()mul(5,5)"
|
||||||
|
assert Day03.solve_part2(input) == {:ok, 8}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "handles multiple control switches" do
|
||||||
|
input = "mul(2,4)don't()mul(5,5)do()mul(8,5)"
|
||||||
|
assert Day03.solve_part2(input) == {:ok, 48}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "starts with multiplications enabled" do
|
||||||
|
input = "mul(3,3)mul(2,2)don't()mul(5,5)"
|
||||||
|
assert Day03.solve_part2(input) == {:ok, 13}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "ignores invalid control instructions" do
|
||||||
|
input = "mul(2,4)dont()mul(5,5)doo()mul(3,3)"
|
||||||
|
assert Day03.solve_part2(input) == {:ok, 42}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "solves README example for part 2" do
|
||||||
|
input = "xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))"
|
||||||
|
assert Day03.solve_part2(input) == {:ok, 48}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
27
test/advent_code2024/solutions/day04/day4_test.exs
Normal file
27
test/advent_code2024/solutions/day04/day4_test.exs
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
defmodule AdventCode2024.Solutions.Day04Test do
|
||||||
|
use ExUnit.Case
|
||||||
|
alias AdventCode2024.Solutions.Day04
|
||||||
|
|
||||||
|
@example_grid [
|
||||||
|
"MMMSXXMASM",
|
||||||
|
"MSAMXMSMSA",
|
||||||
|
"AMXSXMAAMM",
|
||||||
|
"MSAMASMSMX",
|
||||||
|
"XMASAMXAMM",
|
||||||
|
"XXAMMXXAMA",
|
||||||
|
"SMSMSASXSS",
|
||||||
|
"SAXAMASAAA",
|
||||||
|
"MAMMMXMMMM",
|
||||||
|
"MXMXAXMASX"
|
||||||
|
]
|
||||||
|
|
||||||
|
test "count occurrences of XMAS in word search" do
|
||||||
|
expected_count = 18
|
||||||
|
actual_count = Day04.count_word_occurrences(@example_grid, "XMAS")
|
||||||
|
assert actual_count == expected_count
|
||||||
|
end
|
||||||
|
|
||||||
|
test "finds all occurrences of X-MAS in the grid" do
|
||||||
|
assert Day04.count_x_mas(@example_grid) == 9
|
||||||
|
end
|
||||||
|
end
|
||||||
184
test/advent_code2024/solutions/day05/day5_test.exs
Normal file
184
test/advent_code2024/solutions/day05/day5_test.exs
Normal file
|
|
@ -0,0 +1,184 @@
|
||||||
|
defmodule AdventCode2024.Solutions.Day05Test do
|
||||||
|
use ExUnit.Case
|
||||||
|
alias AdventCode2024.Solutions.Day05
|
||||||
|
|
||||||
|
@example_input """
|
||||||
|
47|53
|
||||||
|
97|13
|
||||||
|
97|61
|
||||||
|
97|47
|
||||||
|
75|29
|
||||||
|
61|13
|
||||||
|
75|53
|
||||||
|
29|13
|
||||||
|
97|29
|
||||||
|
53|29
|
||||||
|
61|53
|
||||||
|
97|53
|
||||||
|
61|29
|
||||||
|
47|13
|
||||||
|
75|47
|
||||||
|
97|75
|
||||||
|
47|61
|
||||||
|
75|61
|
||||||
|
47|29
|
||||||
|
75|13
|
||||||
|
53|13
|
||||||
|
|
||||||
|
75,47,61,53,29
|
||||||
|
97,61,53,29,13
|
||||||
|
75,29,13
|
||||||
|
75,97,47,61,53
|
||||||
|
61,13,29
|
||||||
|
97,13,75,29,47
|
||||||
|
"""
|
||||||
|
|
||||||
|
setup_all do
|
||||||
|
# Create a temporary file for testing
|
||||||
|
path = "test/fixtures/day05/test_input.txt"
|
||||||
|
File.mkdir_p!(Path.dirname(path))
|
||||||
|
:ok = File.write(path, @example_input)
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
File.rm!(path)
|
||||||
|
end)
|
||||||
|
|
||||||
|
{:ok, test_file: path}
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "solve/1" do
|
||||||
|
test "correctly identifies valid updates and sums middle pages", %{test_file: path} do
|
||||||
|
assert {:ok, 143} = Day05.solve(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns error for empty input" do
|
||||||
|
assert Day05.solve("") == {:error, :no_input}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns error for invalid file" do
|
||||||
|
assert Day05.solve("priv/nonexistent.txt") == {:error, :enoent}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "validates first update is in correct order" do
|
||||||
|
input = """
|
||||||
|
75|47
|
||||||
|
75|61
|
||||||
|
75|53
|
||||||
|
75|29
|
||||||
|
47|61
|
||||||
|
47|53
|
||||||
|
47|29
|
||||||
|
61|53
|
||||||
|
61|29
|
||||||
|
53|29
|
||||||
|
|
||||||
|
75,47,61,53,29
|
||||||
|
"""
|
||||||
|
path = "test/fixtures/day05/first_update.txt"
|
||||||
|
:ok = File.write(path, input)
|
||||||
|
assert {:ok, 61} = Day05.solve(path)
|
||||||
|
File.rm!(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "validates second update is in correct order" do
|
||||||
|
input = """
|
||||||
|
97|13
|
||||||
|
97|61
|
||||||
|
97|53
|
||||||
|
97|29
|
||||||
|
61|13
|
||||||
|
61|53
|
||||||
|
61|29
|
||||||
|
53|29
|
||||||
|
29|13
|
||||||
|
|
||||||
|
97,61,53,29,13
|
||||||
|
"""
|
||||||
|
path = "test/fixtures/day05/second_update.txt"
|
||||||
|
:ok = File.write(path, input)
|
||||||
|
assert {:ok, 53} = Day05.solve(path)
|
||||||
|
File.rm!(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "identifies invalid update due to rule violation" do
|
||||||
|
input = """
|
||||||
|
97|75
|
||||||
|
|
||||||
|
75,97,47,61,53
|
||||||
|
"""
|
||||||
|
path = "test/fixtures/day05/invalid_update.txt"
|
||||||
|
:ok = File.write(path, input)
|
||||||
|
assert {:ok, 0} = Day05.solve(path)
|
||||||
|
File.rm!(path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "solve_part2/1" do
|
||||||
|
test "correctly orders invalid updates and sums middle pages", %{test_file: path} do
|
||||||
|
assert {:ok, 123} = Day05.solve_part2(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "correctly orders first invalid update" do
|
||||||
|
input = """
|
||||||
|
75|47
|
||||||
|
75|29
|
||||||
|
47|29
|
||||||
|
|
||||||
|
75,47,29
|
||||||
|
"""
|
||||||
|
path = "test/fixtures/day05/part2_first_update.txt"
|
||||||
|
:ok = File.write(path, input)
|
||||||
|
assert {:ok, 47} = Day05.solve_part2(path)
|
||||||
|
File.rm!(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "correctly orders second invalid update" do
|
||||||
|
input = """
|
||||||
|
97|13
|
||||||
|
97|29
|
||||||
|
29|13
|
||||||
|
|
||||||
|
97,29,13
|
||||||
|
"""
|
||||||
|
path = "test/fixtures/day05/part2_second_update.txt"
|
||||||
|
:ok = File.write(path, input)
|
||||||
|
assert {:ok, 29} = Day05.solve_part2(path)
|
||||||
|
File.rm!(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "correctly orders third invalid update" do
|
||||||
|
input = """
|
||||||
|
97|75
|
||||||
|
97|47
|
||||||
|
75|47
|
||||||
|
|
||||||
|
97,75,47
|
||||||
|
"""
|
||||||
|
path = "test/fixtures/day05/part2_third_update.txt"
|
||||||
|
:ok = File.write(path, input)
|
||||||
|
assert {:ok, 47} = Day05.solve_part2(path)
|
||||||
|
File.rm!(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "ignores already correctly ordered updates" do
|
||||||
|
input = """
|
||||||
|
97|13
|
||||||
|
97|61
|
||||||
|
97|53
|
||||||
|
97|29
|
||||||
|
61|13
|
||||||
|
61|53
|
||||||
|
61|29
|
||||||
|
53|29
|
||||||
|
29|13
|
||||||
|
|
||||||
|
97,61,53,29,13
|
||||||
|
61,53,29,13
|
||||||
|
"""
|
||||||
|
path = "test/fixtures/day05/part2_ignore_valid.txt"
|
||||||
|
:ok = File.write(path, input)
|
||||||
|
assert {:ok, 0} = Day05.solve_part2(path)
|
||||||
|
File.rm!(path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
5
test/fixtures/day05/part2_first_update.txt
vendored
Normal file
5
test/fixtures/day05/part2_first_update.txt
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
75|47
|
||||||
|
75|29
|
||||||
|
47|29
|
||||||
|
|
||||||
|
75,47,29
|
||||||
5
test/fixtures/day05/part2_second_update.txt
vendored
Normal file
5
test/fixtures/day05/part2_second_update.txt
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
97|13
|
||||||
|
97|29
|
||||||
|
29|13
|
||||||
|
|
||||||
|
97,29,13
|
||||||
5
test/fixtures/day05/part2_third_update.txt
vendored
Normal file
5
test/fixtures/day05/part2_third_update.txt
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
97|75
|
||||||
|
97|47
|
||||||
|
75|47
|
||||||
|
|
||||||
|
97,75,47
|
||||||
|
|
@ -1 +1 @@
|
||||||
ExUnit.start()
|
ExUnit.start(exclude: [:skip])
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue