#!/usr/bin/env python from collections import defaultdict def read_input(filename): with open(filename) as f: for line in f: line = line.strip() yield line def find_xmas(data, posX, posY, dirX, dirY): if data[posX][posY] != 'X': return 0 if data[posX+(1*dirX)][posY+(1*dirY)] != 'M': return 0 if data[posX+(2*dirX)][posY+(2*dirY)] != 'A': return 0 if data[posX+(3*dirX)][posY+(3*dirY)] != 'S': return 0 return 1 def main(args): puzzle = defaultdict(lambda: defaultdict(lambda: ".")) for id1, line in enumerate(read_input(args.file)): for id2, char in enumerate(list(line)): puzzle[id1][id2] = char count = 0 for posX in range(len(puzzle)): for posY in range(len(puzzle[posX])): if puzzle[posX][posY] != 'X': continue count += find_xmas(puzzle, posX, posY, 0, 1) count += find_xmas(puzzle, posX, posY, 0, -1) count += find_xmas(puzzle, posX, posY, 1, 0) count += find_xmas(puzzle, posX, posY, -1, 0) count += find_xmas(puzzle, posX, posY, 1, 1) count += find_xmas(puzzle, posX, posY, 1, -1) count += find_xmas(puzzle, posX, posY, -1, 1) count += find_xmas(puzzle, posX, posY, -1, -1) print(count) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser( prog='AdventOfCode 2024, Day 04, part 1', ) parser.add_argument('-f', '--file', required=True) args = parser.parse_args() main(args)