mirror of
https://github.com/rjNemo/ai_advent_code_2024
synced 2026-06-06 02:26:44 +00:00
Compare commits
19 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e6c0d59c2b | |||
| fbc39fe430 | |||
| 17655469a6 | |||
| d742148e96 | |||
| 901ad6c645 | |||
| 2d73d1bb51 | |||
| 04787bd7f9 | |||
| 143b8c0742 | |||
| 6132f3d3d2 | |||
| 542cb5b06d | |||
| 4f5ae71599 | |||
| 998b6f6405 | |||
| bacce02f21 | |||
| 6aec2849a1 | |||
| c2e2b4c31c | |||
| 34a89c44f7 | |||
| df41b278f8 | |||
| ae53d65980 | |||
| bdb91371cd |
14 changed files with 2293 additions and 15 deletions
|
|
@ -5,13 +5,14 @@ defmodule AdventCode2024.Solutions.Day03 do
|
||||||
|
|
||||||
@behaviour AdventCode2024.Solution
|
@behaviour AdventCode2024.Solution
|
||||||
|
|
||||||
@default_input "lib/advent_code2024/solutions/day03/input.txt"
|
@default_input "priv/inputs/day03/input.txt"
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Solve part 1 of the challenge
|
Solve part 1 of the challenge
|
||||||
"""
|
"""
|
||||||
def solve(input \\ @default_input)
|
def solve(input \\ @default_input)
|
||||||
def solve(""), do: {:error, :no_input}
|
def solve(""), do: {:error, :no_input}
|
||||||
|
|
||||||
def solve(input) when is_binary(input) and input != "" do
|
def solve(input) when is_binary(input) and input != "" do
|
||||||
cond do
|
cond do
|
||||||
# Check if it looks like a file path and try to read it
|
# Check if it looks like a file path and try to read it
|
||||||
|
|
@ -32,6 +33,7 @@ defmodule AdventCode2024.Solutions.Day03 do
|
||||||
"""
|
"""
|
||||||
def solve_part2(input \\ @default_input)
|
def solve_part2(input \\ @default_input)
|
||||||
def solve_part2(""), do: {:error, :no_input}
|
def solve_part2(""), do: {:error, :no_input}
|
||||||
|
|
||||||
def solve_part2(input) when is_binary(input) and input != "" do
|
def solve_part2(input) when is_binary(input) and input != "" do
|
||||||
cond do
|
cond do
|
||||||
# Check if it looks like a file path and try to read it
|
# Check if it looks like a file path and try to read it
|
||||||
|
|
@ -50,6 +52,7 @@ defmodule AdventCode2024.Solutions.Day03 do
|
||||||
# Private functions
|
# Private functions
|
||||||
|
|
||||||
defp solve_content(""), do: {:error, :no_input}
|
defp solve_content(""), do: {:error, :no_input}
|
||||||
|
|
||||||
defp solve_content(content) when is_binary(content) and content != "" do
|
defp solve_content(content) when is_binary(content) and content != "" do
|
||||||
result =
|
result =
|
||||||
~r/mul\((\d{1,3}),(\d{1,3})\)/
|
~r/mul\((\d{1,3}),(\d{1,3})\)/
|
||||||
|
|
@ -68,6 +71,7 @@ defmodule AdventCode2024.Solutions.Day03 do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp solve_part2_content(""), do: {:error, :no_input}
|
defp solve_part2_content(""), do: {:error, :no_input}
|
||||||
|
|
||||||
defp solve_part2_content(content) when is_binary(content) and content != "" do
|
defp solve_part2_content(content) when is_binary(content) and content != "" do
|
||||||
{result, _} = process_multiplications(content)
|
{result, _} = process_multiplications(content)
|
||||||
{:ok, result}
|
{:ok, result}
|
||||||
|
|
@ -75,9 +79,10 @@ defmodule AdventCode2024.Solutions.Day03 do
|
||||||
|
|
||||||
defp process_multiplications(content) do
|
defp process_multiplications(content) do
|
||||||
# Split content into tokens that match either multiplication or control instructions
|
# 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)
|
tokens =
|
||||||
|> List.flatten()
|
Regex.scan(~r/(?:mul\(\d{1,3},\d{1,3}\)|do\(\)|don't\(\))|(?:do|don't)\(\)/, content)
|
||||||
|> Enum.filter(&(&1 in ["do()", "don't()"] or String.starts_with?(&1, "mul(")))
|
|> List.flatten()
|
||||||
|
|> Enum.filter(&(&1 in ["do()", "don't()"] or String.starts_with?(&1, "mul(")))
|
||||||
|
|
||||||
# Process tokens in order, tracking multiplication state
|
# Process tokens in order, tracking multiplication state
|
||||||
tokens
|
tokens
|
||||||
|
|
@ -85,12 +90,17 @@ defmodule AdventCode2024.Solutions.Day03 do
|
||||||
cond do
|
cond do
|
||||||
token == "do()" ->
|
token == "do()" ->
|
||||||
{sum, true}
|
{sum, true}
|
||||||
|
|
||||||
token == "don't()" ->
|
token == "don't()" ->
|
||||||
{sum, false}
|
{sum, false}
|
||||||
|
|
||||||
String.starts_with?(token, "mul") && multiply_enabled ->
|
String.starts_with?(token, "mul") && multiply_enabled ->
|
||||||
[n1, n2] = Regex.run(~r/mul\((\d{1,3}),(\d{1,3})\)/, token, capture: :all_but_first)
|
[n1, n2] =
|
||||||
|> Enum.map(&String.to_integer/1)
|
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}
|
{sum + n1 * n2, multiply_enabled}
|
||||||
|
|
||||||
true ->
|
true ->
|
||||||
{sum, multiply_enabled}
|
{sum, multiply_enabled}
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
# Add your puzzle input here
|
|
||||||
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
|
||||||
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
|
|
@ -8,7 +8,7 @@ defmodule AdventCode2024.Solutions.Day03Test do
|
||||||
end
|
end
|
||||||
|
|
||||||
test "returns error for invalid file" do
|
test "returns error for invalid file" do
|
||||||
assert Day03.solve("nonexistent.txt") == {:error, :enoent}
|
assert Day03.solve("priv/nonexistent.txt") == {:error, :enoent}
|
||||||
end
|
end
|
||||||
|
|
||||||
test "handles single valid multiplication" do
|
test "handles single valid multiplication" do
|
||||||
|
|
@ -48,7 +48,7 @@ defmodule AdventCode2024.Solutions.Day03Test do
|
||||||
end
|
end
|
||||||
|
|
||||||
test "returns error for invalid file" do
|
test "returns error for invalid file" do
|
||||||
assert Day03.solve_part2("nonexistent.txt") == {:error, :enoent}
|
assert Day03.solve_part2("priv/nonexistent.txt") == {:error, :enoent}
|
||||||
end
|
end
|
||||||
|
|
||||||
test "handles single multiplication with do/don't controls" do
|
test "handles single multiplication with do/don't controls" do
|
||||||
|
|
@ -73,7 +73,12 @@ defmodule AdventCode2024.Solutions.Day03Test do
|
||||||
|
|
||||||
test "ignores invalid control instructions" do
|
test "ignores invalid control instructions" do
|
||||||
input = "mul(2,4)dont()mul(5,5)doo()mul(3,3)"
|
input = "mul(2,4)dont()mul(5,5)doo()mul(3,3)"
|
||||||
assert Day03.solve_part2(input) == {:ok, 38}
|
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
|
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
|
||||||
Loading…
Reference in a new issue