Compare commits
2 commits
38013bf705
...
f9b2cbf69a
Author | SHA1 | Date | |
---|---|---|---|
f9b2cbf69a | |||
93318458bf |
3 changed files with 120 additions and 16 deletions
|
@ -106,22 +106,18 @@ def find_xmas(data: np.array):
|
||||||
for i in range(data.shape[0]):
|
for i in range(data.shape[0]):
|
||||||
for j in range(data.shape[1]):
|
for j in range(data.shape[1]):
|
||||||
if data[i, j] == "X":
|
if data[i, j] == "X":
|
||||||
if is_horizontal_forwards(data, i, j):
|
score += sum(
|
||||||
score += 1
|
[
|
||||||
if is_horizontal_backwards(data, i, j):
|
is_horizontal_forwards(data, i, j),
|
||||||
score += 1
|
is_horizontal_backwards(data, i, j),
|
||||||
if is_vertical_downwards(data, i, j):
|
is_vertical_downwards(data, i, j),
|
||||||
score += 1
|
is_vertical_upwards(data, i, j),
|
||||||
if is_vertical_upwards(data, i, j):
|
is_diagonal_forwards_downwards(data, i, j),
|
||||||
score += 1
|
is_diagonal_forwards_upwards(data, i, j),
|
||||||
if is_diagonal_forwards_downwards(data, i, j):
|
is_diagonal_backwards_downwards(data, i, j),
|
||||||
score += 1
|
is_diagonal_backwards_upwards(data, i, j),
|
||||||
if is_diagonal_forwards_upwards(data, i, j):
|
]
|
||||||
score += 1
|
)
|
||||||
if is_diagonal_backwards_downwards(data, i, j):
|
|
||||||
score += 1
|
|
||||||
if is_diagonal_backwards_upwards(data, i, j):
|
|
||||||
score += 1
|
|
||||||
|
|
||||||
return score
|
return score
|
||||||
|
|
||||||
|
|
75
src/aoc_2024/day4/part2.py
Normal file
75
src/aoc_2024/day4/part2.py
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
def is_diagonal_forwards_downwards(data, i, j):
|
||||||
|
if data[i - 1, j - 1] == "M":
|
||||||
|
if data[i + 1, j + 1] == "S":
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_diagonal_forwards_upwards(data, i, j):
|
||||||
|
if data[i + 1, j - 1] == "M":
|
||||||
|
if data[i - 1, j + 1] == "S":
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_diagonal_backwards_upwards(data, i, j):
|
||||||
|
if data[i + 1, j + 1] == "M":
|
||||||
|
if data[i - 1, j - 1] == "S":
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_diagonal_backwards_downwards(data, i, j):
|
||||||
|
if data[i - 1, j + 1] == "M":
|
||||||
|
if data[i + 1, j - 1] == "S":
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_diagonal1(data, i, j):
|
||||||
|
return is_diagonal_forwards_downwards(data, i, j) or is_diagonal_backwards_upwards(
|
||||||
|
data, i, j
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def is_diagonal2(data, i, j):
|
||||||
|
return is_diagonal_backwards_downwards(data, i, j) or is_diagonal_forwards_upwards(
|
||||||
|
data, i, j
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def find_x_mas(data: np.array):
|
||||||
|
score = 0
|
||||||
|
for i in range(1, data.shape[0] - 1):
|
||||||
|
for j in range(1, data.shape[1] - 1):
|
||||||
|
if data[i, j] == "A":
|
||||||
|
if is_diagonal1(data, i, j) and is_diagonal2(data, i, j):
|
||||||
|
score += 1
|
||||||
|
|
||||||
|
return score
|
||||||
|
|
||||||
|
|
||||||
|
def main(file: Path) -> int:
|
||||||
|
data_str = file.read_text()
|
||||||
|
x_axis_size = data_str.find("\n")
|
||||||
|
y_axis_size = data_str.count("\n") + 1
|
||||||
|
data = np.full((x_axis_size, y_axis_size), "")
|
||||||
|
i, j = 0, 0
|
||||||
|
for character in data_str:
|
||||||
|
if character != "\n":
|
||||||
|
data[i, j] = character
|
||||||
|
j += 1
|
||||||
|
else:
|
||||||
|
i += 1
|
||||||
|
j = 0
|
||||||
|
return find_x_mas(data)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
input_file = Path(__file__).parent / "input-data"
|
||||||
|
print(main(input_file))
|
33
tests/aoc_2024/day4/test_part2.py
Normal file
33
tests/aoc_2024/day4/test_part2.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from aoc_2024.day4 import part2
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
def test_find_all():
|
||||||
|
data_str = """MMMSXXMASM
|
||||||
|
MSAMXMSMSA
|
||||||
|
AMXSXMAAMM
|
||||||
|
MSAMASMSMX
|
||||||
|
XMASAMXAMM
|
||||||
|
XXAMMXXAMA
|
||||||
|
SMSMSASXSS
|
||||||
|
SAXAMASAAA
|
||||||
|
MAMMMXMMMM
|
||||||
|
MXMXAXMASX"""
|
||||||
|
data = np.full((10, 10), "")
|
||||||
|
i, j = 0, 0
|
||||||
|
for character in data_str:
|
||||||
|
if character != "\n":
|
||||||
|
data[i, j] = character
|
||||||
|
j += 1
|
||||||
|
else:
|
||||||
|
i += 1
|
||||||
|
j = 0
|
||||||
|
assert part2.find_x_mas(data) == 9
|
||||||
|
|
||||||
|
|
||||||
|
def test_main():
|
||||||
|
data_file = Path(__file__).parent / "test-data"
|
||||||
|
assert part2.main(data_file) == 9
|
Loading…
Add table
Add a link
Reference in a new issue