mirror of
https://github.com/rjNemo/ai_advent_code_2024
synced 2026-06-08 11:36:44 +00:00
Compare commits
1 commit
| Author | SHA1 | Date | |
|---|---|---|---|
| a4d9ba205a |
14 changed files with 14 additions and 2287 deletions
|
|
@ -5,14 +5,13 @@ defmodule AdventCode2024.Solutions.Day03 do
|
||||||
|
|
||||||
@behaviour AdventCode2024.Solution
|
@behaviour AdventCode2024.Solution
|
||||||
|
|
||||||
@default_input "priv/inputs/day03/input.txt"
|
@default_input "lib/advent_code2024/solutions/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
|
||||||
|
|
@ -21,9 +20,9 @@ defmodule AdventCode2024.Solutions.Day03 do
|
||||||
{:ok, content} -> solve_content(content)
|
{:ok, content} -> solve_content(content)
|
||||||
{:error, reason} -> {:error, reason}
|
{:error, reason} -> {:error, reason}
|
||||||
end
|
end
|
||||||
|
|
||||||
# Treat as direct content
|
# Treat as direct content
|
||||||
true ->
|
true ->
|
||||||
solve_content(input)
|
solve_content(input)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -33,7 +32,6 @@ 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
|
||||||
|
|
@ -42,9 +40,9 @@ defmodule AdventCode2024.Solutions.Day03 do
|
||||||
{:ok, content} -> solve_part2_content(content)
|
{:ok, content} -> solve_part2_content(content)
|
||||||
{:error, reason} -> {:error, reason}
|
{:error, reason} -> {:error, reason}
|
||||||
end
|
end
|
||||||
|
|
||||||
# Treat as direct content
|
# Treat as direct content
|
||||||
true ->
|
true ->
|
||||||
solve_part2_content(input)
|
solve_part2_content(input)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -52,12 +50,11 @@ 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})\)/
|
||||||
|> Regex.scan(content, capture: :all_but_first)
|
|> Regex.scan(content, capture: :all_but_first)
|
||||||
|> Enum.map(fn [x, y] ->
|
|> Enum.map(fn [x, y] ->
|
||||||
with {x_int, ""} <- Integer.parse(x),
|
with {x_int, ""} <- Integer.parse(x),
|
||||||
{y_int, ""} <- Integer.parse(y) do
|
{y_int, ""} <- Integer.parse(y) do
|
||||||
x_int * y_int
|
x_int * y_int
|
||||||
|
|
@ -71,7 +68,6 @@ 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}
|
||||||
|
|
@ -79,10 +75,9 @@ 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 =
|
tokens = Regex.scan(~r/(?:mul\(\d{1,3},\d{1,3}\)|do\(\)|don't\(\))|(?:do|don't)\(\)/, content)
|
||||||
Regex.scan(~r/(?:mul\(\d{1,3},\d{1,3}\)|do\(\)|don't\(\))|(?:do|don't)\(\)/, content)
|
|> List.flatten()
|
||||||
|> List.flatten()
|
|> Enum.filter(&(&1 in ["do()", "don't()"] or String.starts_with?(&1, "mul(")))
|
||||||
|> 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
|
||||||
|
|
@ -90,17 +85,12 @@ 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] =
|
[n1, n2] = Regex.run(~r/mul\((\d{1,3}),(\d{1,3})\)/, token, capture: :all_but_first)
|
||||||
Regex.run(~r/mul\((\d{1,3}),(\d{1,3})\)/, token, capture: :all_but_first)
|
|> Enum.map(&String.to_integer/1)
|
||||||
|> 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
lib/advent_code2024/solutions/day03/input.txt
Normal file
1
lib/advent_code2024/solutions/day03/input.txt
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
# Add your puzzle input here
|
||||||
|
|
@ -1,109 +0,0 @@
|
||||||
# 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?
|
|
||||||
|
|
@ -1,183 +0,0 @@
|
||||||
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
|
|
||||||
|
|
@ -1,111 +0,0 @@
|
||||||
# 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?
|
|
||||||
|
|
@ -1,109 +0,0 @@
|
||||||
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
|
|
||||||
|
|
@ -1,140 +0,0 @@
|
||||||
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
|
|
||||||
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("priv/nonexistent.txt") == {:error, :enoent}
|
assert Day03.solve("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("priv/nonexistent.txt") == {:error, :enoent}
|
assert Day03.solve_part2("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
|
||||||
|
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
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
|
|
||||||
|
|
@ -1,184 +0,0 @@
|
||||||
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
5
test/fixtures/day05/part2_first_update.txt
vendored
|
|
@ -1,5 +0,0 @@
|
||||||
75|47
|
|
||||||
75|29
|
|
||||||
47|29
|
|
||||||
|
|
||||||
75,47,29
|
|
||||||
5
test/fixtures/day05/part2_second_update.txt
vendored
5
test/fixtures/day05/part2_second_update.txt
vendored
|
|
@ -1,5 +0,0 @@
|
||||||
97|13
|
|
||||||
97|29
|
|
||||||
29|13
|
|
||||||
|
|
||||||
97,29,13
|
|
||||||
5
test/fixtures/day05/part2_third_update.txt
vendored
5
test/fixtures/day05/part2_third_update.txt
vendored
|
|
@ -1,5 +0,0 @@
|
||||||
97|75
|
|
||||||
97|47
|
|
||||||
75|47
|
|
||||||
|
|
||||||
97,75,47
|
|
||||||
Loading…
Reference in a new issue