--- 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?
let fs = require('fs');
let rows = fs.readFileSync('input.txt').toString().split("\n");

// We need a Width and a Height - we will assume it is a rectangular wordsearch and that all rows are the same length
const WIDTH = rows[0].length;
const HEIGHT = rows.length;

const DIRECTIONS = [
    [1, 0], // East
    [1, 1], // South East
    [0, 1], // South
    [-1, 1], // South West
    [-1, 0], // West
    [-1, -1], // North West
    [0, -1], // North
    [1, -1], // North East
];

const SEARCH = 'XMAS';

// Keep a running total of how many times we have found the Search Word
let runningTotal = 0;

rows.forEach((row, rowIndex) => {
    if (row.length > 0) {
        [...row].forEach((letter, colIndex) => {
            if (letter === SEARCH[0]) {
                DIRECTIONS.forEach((direction) => {
                    for (let i = 1; i <= SEARCH.length - 1; i++) {
                        let coordY = rowIndex + (direction[0] * i);
                        let coordX = colIndex + (direction[1] * i);
                        if (coordY < HEIGHT && coordY >= 0 && coordX < WIDTH && coordX >= 0) {
                            if (rows[coordY][coordX] === SEARCH[i]) {
                                if (i === SEARCH.length - 1) {
                                    runningTotal++;
                                    break;
                                }
                            } else {
                                break;
                            }
                        }
                    }
                });
            }
        });
    }
});

console.log(runningTotal);