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?
  
  Your puzzle answer was 2434.
  
  --- Part Two ---
  
  The Elf looks quizzically at you. Did you misunderstand the assignment?
  
  Looking for the instructions, you flip over the word search to find that this isn't actually an XMAS puzzle; it's an X-MAS puzzle in which you're supposed to find two MAS in the shape of an X. One way to achieve that is like this:
  
  M.S
  .A.
  M.S
  Irrelevant characters have again been replaced with . in the above diagram. Within the X, each MAS can be written forwards or backwards.
  
  Here's the same example from before, but this time all of the X-MASes have been kept instead:
  
  .M.S......
  ..A..MSMS.
  .M.S.MAA..
  ..A.ASMSM.
  .M.S.M....
  ..........
  S.S.S.S.S.
  .A.A.A.A..
  M.M.M.M.M.
  ..........
  In this example, an X-MAS appears 9 times.
  
  Flip the word search from the instructions back over to the word search side and try again. How many times does an X-MAS appear?
solution: template = [
      "S..S..S",
      ".A.A.A.",
      "..MMM.."
      "SAMXMAS",
      "..MMM.."
      ".A.A.A.",
      "S..S..S",
  ]
  
  def find_xmas(lines: str) -> int:
      total = 0
      for row in range(len(lines)):
          for col in range(len(lines[row])):
              if lines[row][col] == "X":
                  # Horizontal
                  if col + 1 < len(lines[row]) and col + 2 < len(lines[row]) and col + 3 < len(lines[row]):
                      total += lines[row][col+1] == "M" and lines[row][col+2] == "A" and lines[row][col+3] == "S"
                  
                  # Horizontal reverse
                  if col - 1 >= 0 and col - 2 >= 0 and col - 3 >= 0:
                      total += lines[row][col-1] == "M" and lines[row][col-2] == "A" and lines[row][col-3] == "S"
  
                  # Vertical
                  if row + 1 < len(lines) and row + 2 < len(lines) and row + 3 < len(lines):
                      total += lines[row+1][col] == "M" and lines[row+2][col] == "A" and lines[row+3][col] == "S"
  
                  # Vertical reverse
                  if row - 1 >= 0 and row - 2 >= 0 and row - 3 >= 0:
                      total += lines[row-1][col] == "M" and lines[row-2][col] == "A" and lines[row-3][col] == "S"
  
                  # Diagonal
                  if row + 1 < len(lines) and row + 2 < len(lines) and row + 3 < len(lines) and col + 1 < len(lines[row]) and col + 2 < len(lines[row]) and col + 3 < len(lines[row]):
                      total += lines[row+1][col+1] == "M" and lines[row+2][col+2] == "A" and lines[row+3][col+3] == "S"
  
                  # Diagonal reverse
                  if row - 1 >= 0 and row - 2 >= 0 and row - 3 >= 0 and col - 1 >= 0 and col - 2 >= 0 and col - 3 >= 0:
                      total += lines[row-1][col-1] == "M" and lines[row-2][col-2] == "A" and lines[row-3][col-3] == "S"
  
                  # Diagonal reverse
                  if row - 1 >= 0 and row - 2 >= 0 and row - 3 >= 0 and col + 1 < len(lines[row]) and col + 2 < len(lines[row]) and col + 3 < len(lines[row]):
                      total += lines[row-1][col+1] == "M" and lines[row-2][col+2] == "A" and lines[row-3][col+3] == "S"
  
                  # Diagonal reverse
                  if row + 1 < len(lines) and row + 2 < len(lines) and row + 3 < len(lines) and col - 1 >= 0 and col - 2 >= 0 and col - 3 >= 0:
                      total += lines[row+1][col-1] == "M" and lines[row+2][col-2] == "A" and lines[row+3][col-3] == "S"
  
      return total
  
  def find_x_mas(lines: str) -> int:
      total = 0
      for row in range(len(lines)):
          for col in range(len(lines[row])):
              if lines[row][col] == "A":
                  # Diagonal
                  if row + 1 < len(lines) and row - 1 >= 0 and col + 1 < len(lines[row]) and col - 1 >= 0:
                      total += (((lines[row+1][col+1] == "M" and lines[row-1][col-1] == "S") or (lines[row+1][col+1] == "S" and lines[row-1][col-1] == "M"))
                      and ((lines[row+1][col-1] == "M" and lines[row-1][col+1] == "S") or (lines[row+1][col-1] == "S" and lines[row-1][col+1] == "M")))
  
      return total
  
  def part1():
      input = ""
      with open("input.txt") as f:
          input = f.readlines()
  
      total = find_xmas(input)
      print(total)
  
  def part2():
      input = ""
      with open("input.txt") as f:
          input = f.readlines()
  
      total = find_x_mas(input)
      print(total)
  
  part2()