question: --- Day 4: Ceres Search ---
  
  "Looks like the Chief's not here. Next!" One of The Historians pulls out a device and pushes the only button on it. After a brief flash, you recognize the interior of the Ceres monitoring station!
  
  As the search for the Chief continues, a small Elf who lives on the station tugs on your shirt; she'd like to know if you could help her with her word search (your puzzle input). She only has to find one word: XMAS.
  
  This word search allows words to be horizontal, vertical, diagonal, written backwards, or even overlapping other words. It's a little unusual, though, as you don't merely need to find one instance of XMAS - you need to find all of them. Here are a few ways XMAS might appear, where irrelevant characters have been replaced with .:
  
  ..X...
  .SAMX.
  .A..A.
  XMAS.S
  .X....
  The actual word search will be full of letters instead. For example:
  
  MMMSXXMASM
  MSAMXMSMSA
  AMXSXMAAMM
  MSAMASMSMX
  XMASAMXAMM
  XXAMMXXAMA
  SMSMSASXSS
  SAXAMASAAA
  MAMMMXMMMM
  MXMXAXMASX
  In this word search, XMAS occurs a total of 18 times; here's the same word search again, but where letters not involved in any XMAS have been replaced with .:
  
  ....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
  Take a look at the little Elf's word search. How many times does XMAS appear?
solution: DIRECTIONS = [
      (1, 0),
      (0, 1),
      (-1, 0),
      (0, -1),
      (1, 1),
      (-1, -1),
      (-1, 1),
      (1, -1),
  ]
  
  def count_xmas(x, y):
      count = 0
      for dx, dy in DIRECTIONS:
          if all(
              0 <= x + i * dx < width and
              0 <= y + i * dy < height and
              words[x + i * dx][y + i * dy] == letter
              for i, letter in enumerate("MAS", start=1)
          ):
              count += 1
      return count
  
  
  def main():
      result = 0
      for x in range(width):
          for y in range(height):
              if words[x][y] == 'X':
                  result += count_xmas(x, y)
  
      print(f'{result=}')
  
  
  with open("04_input.txt", "r") as f:
      words = [list(c) for c in [line.strip() for line in f.readlines()]]
  
  width = len(words[0])
  height = len(words)
  main()