--- 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?
DIRECTIONS = [
  [1, 0],
  [0, 1],
  [-1, 0],
  [0, -1],
  [1, 1],
  [-1, -1],
  [-1, 1],
  [1, -1],
]

def count_xmas(x, y, words, width, height)
  count = 0
  DIRECTIONS.each do |dx, dy|
    if (1..3).all? do |i|
      nx = x + i * dx
      ny = y + i * dy
      nx.between?(0, width - 1) && ny.between?(0, height - 1) && words[nx][ny] == "MAS"[i - 1]
    end
      count += 1
    end
  end
  count
end

def main(words, width, height)
  result = 0
  (0...width).each do |x|
    (0...height).each do |y|
      if words[x][y] == "X"
        result += count_xmas(x, y, words, width, height)
      end
    end
  end
  puts "result=#{result}"
end

words = File.readlines("input.txt").map(&:strip).map { |line| line.chars }

width = words[0].length
height = words.length
main(words, width, height)