mirror of
https://github.com/rjNemo/ai_advent_code_2024
synced 2026-06-06 02:26:44 +00:00
feat: Implement X-MAS pattern counting algorithm for grid search
This commit is contained in:
parent
4f5ae71599
commit
542cb5b06d
1 changed files with 56 additions and 1 deletions
|
|
@ -85,6 +85,61 @@ defmodule AdventCode2024.Solutions.Day04 do
|
||||||
def solve_part2(_input_file) do
|
def solve_part2(_input_file) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def count_x_mas(grid) do
|
def count_x_mas(grid) when is_list(grid) do
|
||||||
|
# Convert string rows to character grid
|
||||||
|
char_grid = Enum.map(grid, &String.graphemes/1)
|
||||||
|
rows = length(char_grid)
|
||||||
|
cols = length(Enum.at(char_grid, 0))
|
||||||
|
|
||||||
|
# Check each possible center position
|
||||||
|
for row <- 1..(rows - 2),
|
||||||
|
col <- 1..(cols - 2),
|
||||||
|
reduce: 0 do
|
||||||
|
acc ->
|
||||||
|
if is_x_mas_pattern?(char_grid, {row, col}) do
|
||||||
|
acc + 1
|
||||||
|
else
|
||||||
|
acc
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp is_x_mas_pattern?(grid, {row, col}) do
|
||||||
|
# Define the four possible X patterns (clockwise from top-left)
|
||||||
|
patterns = [
|
||||||
|
# Top-left to bottom-right + Top-right to bottom-left
|
||||||
|
[{-1, -1}, {0, 0}, {1, 1}, {-1, 1}, {0, 0}, {1, -1}],
|
||||||
|
# Top-right to bottom-left + Top-left to bottom-right
|
||||||
|
[{-1, 1}, {0, 0}, {1, -1}, {-1, -1}, {0, 0}, {1, 1}],
|
||||||
|
# Bottom-right to top-left + Bottom-left to top-right
|
||||||
|
[{1, 1}, {0, 0}, {-1, -1}, {1, -1}, {0, 0}, {-1, 1}],
|
||||||
|
# Bottom-left to top-right + Bottom-right to top-left
|
||||||
|
[{1, -1}, {0, 0}, {-1, 1}, {1, 1}, {0, 0}, {-1, -1}]
|
||||||
|
]
|
||||||
|
|
||||||
|
Enum.any?(patterns, fn pattern ->
|
||||||
|
check_x_pattern?(grid, {row, col}, pattern)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp check_x_pattern?(grid, {center_row, center_col}, positions) do
|
||||||
|
letters = positions
|
||||||
|
|> Enum.map(fn {dr, dc} ->
|
||||||
|
r = center_row + dr
|
||||||
|
c = center_col + dc
|
||||||
|
if within_bounds?(grid, r, c) do
|
||||||
|
Enum.at(Enum.at(grid, r), c)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
case letters do
|
||||||
|
[m1, a1, s1, m2, a2, s2] when not is_nil(m1) and not is_nil(s1) and not is_nil(m2) and not is_nil(s2) ->
|
||||||
|
# Check if we have valid MAS patterns in both diagonals
|
||||||
|
(m1 == "M" and a1 == "A" and s1 == "S" and
|
||||||
|
m2 == "M" and a2 == "A" and s2 == "S") or
|
||||||
|
(s1 == "S" and a1 == "A" and m1 == "M" and
|
||||||
|
s2 == "S" and a2 == "A" and m2 == "M")
|
||||||
|
_ -> false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue