mirror of
https://github.com/Threnklyn/advent-of-code-go.git
synced 2026-05-18 19:13:27 +02:00
2024-4
This commit is contained in:
@@ -0,0 +1,80 @@
|
|||||||
|
from typing import List, Tuple
|
||||||
|
|
||||||
|
|
||||||
|
example = """MMMSXXMASM
|
||||||
|
MSAMXMSMSA
|
||||||
|
AMXSXMAAMM
|
||||||
|
MSAMASMSMX
|
||||||
|
XMASAMXAMM
|
||||||
|
XXAMMXXAMA
|
||||||
|
SMSMSASXSS
|
||||||
|
SAXAMASAAA
|
||||||
|
MAMMMXMMMM
|
||||||
|
MXMXAXMASX"""
|
||||||
|
|
||||||
|
|
||||||
|
def part1(input: str) -> int:
|
||||||
|
grid: List[str] = input.splitlines()
|
||||||
|
|
||||||
|
ans = 0
|
||||||
|
|
||||||
|
# 8 directions that words can be found in once a "X" is found
|
||||||
|
dirs: List[Tuple[int, int]] = [
|
||||||
|
(-1, -1),
|
||||||
|
(-1, 0),
|
||||||
|
(-1, 1),
|
||||||
|
(0, -1),
|
||||||
|
(0, 1),
|
||||||
|
(1, -1),
|
||||||
|
(1, 0),
|
||||||
|
(1, 1),
|
||||||
|
]
|
||||||
|
|
||||||
|
for i in range(len(grid)):
|
||||||
|
for j in range(len(grid[0])):
|
||||||
|
if grid[i][j] == "X":
|
||||||
|
for dir in dirs:
|
||||||
|
if getWord(grid, i, j, dir) == "XMAS":
|
||||||
|
ans += 1
|
||||||
|
return ans
|
||||||
|
|
||||||
|
|
||||||
|
def getWord(grid: List[str], row: int, col: int, dir: Tuple[int, int]) -> str:
|
||||||
|
word = grid[row][col]
|
||||||
|
while len(word) < 4:
|
||||||
|
row += dir[0]
|
||||||
|
col += dir[1]
|
||||||
|
if row < 0 or row >= len(grid) or col < 0 or col >= len(grid[0]):
|
||||||
|
return ""
|
||||||
|
word += grid[row][col]
|
||||||
|
|
||||||
|
return word
|
||||||
|
|
||||||
|
|
||||||
|
def part2(input: str) -> int:
|
||||||
|
grid: List[str] = input.splitlines()
|
||||||
|
|
||||||
|
ans: int = 0
|
||||||
|
|
||||||
|
# do not search outer border of the grid because we're looking for A's which
|
||||||
|
# will only be "valid" if they are not on the outer border
|
||||||
|
for i in range(1, len(grid) - 1):
|
||||||
|
for j in range(1, len(grid[0]) - 1):
|
||||||
|
if grid[i][j] == "A":
|
||||||
|
backslash_word = grid[i - 1][j - 1] + grid[i + 1][j + 1]
|
||||||
|
slash_word = grid[i - 1][j + 1] + grid[i + 1][j - 1]
|
||||||
|
|
||||||
|
backslash_valid = backslash_word == "MS" or backslash_word == "SM"
|
||||||
|
slash_valid = slash_word == "MS" or slash_word == "SM"
|
||||||
|
if backslash_valid and slash_valid:
|
||||||
|
ans += 1
|
||||||
|
return ans
|
||||||
|
|
||||||
|
|
||||||
|
input = open("input.txt", "r").read()
|
||||||
|
|
||||||
|
print(f"part1 example: {part1(example)} want 18")
|
||||||
|
print(f"part1: {part1(input)} want 2468")
|
||||||
|
|
||||||
|
print(f"part2 example: {part2(example)} want 9")
|
||||||
|
print(f"part2: {part2(input)} want 1864")
|
||||||
Reference in New Issue
Block a user