Sopa de letras (Parte 1)

Este desafío consiste en encontrar palabras en una cuadrícula de 8x8. Dadas una cadena de 64 letters y una cadena de words que se deben encontrar, convierte la cadena en un arreglo de 8x8 y devuelve true si se pueden encontrar todas las palabras de la cadena en el arreglo. Devuelve false en caso contrario. Las palabras se pueden leer en cualquier dirección (horizontal, vertical o diagonal).

Ejemplo

letters = "PSUWHATSLPACKAGENYOLRDVLFINGEZBMIREHQNJOATBVGYESJDUWUESTPSTICKEY"
words = ["stick", "most", "key", "vein", "yes", "package", "tube", "target", "elm", "spy"]

Esto daría la lista siguiente:

[
  ["P", "S", "U", "W", "H", "A", "T", "S"],
  ["L", "P", "A", "C", "K", "A", "G", "E"],
  ["N", "Y", "O", "L", "R", "D", "V", "L"],
  ["F", "I", "N", "G", "E", "Z", "B", "M"],
  ["I", "R", "E", "H", "Q", "N", "J", "O"],
  ["A", "T", "B", "V", "G", "Y", "E", "S"],
  ["J", "D", "U", "W", "U", "E", "S", "T"],
  ["P", "S", "T", "I", "C", "K", "E", "Y"]
]

Devolverías true, ya que se pueden encontrar todas las palabras:

[
  ["_", "S", "_", "_", "_", "_", "T", "_"],
  ["_", "P", "A", "C", "K", "A", "G", "E"],
  ["N", "Y", "_", "_", "R", "_", "_", "L"],
  ["_", "I", "_", "G", "_", "_", "_", "M"],
  ["_", "_", "E", "_", "_", "_", "_", "O"],
  ["_", "T", "B", "V", "_", "Y", "E", "S"],
  ["_", "_", "U", "_", "_", "E", "_", "T"],
  ["_", "S", "T", "I", "C", "K", "_", "_"]
]

Notas

Las palabras deben estar contenidas dentro de la cuadrícula, sin saltar de un extremo al otro de las columnas o filas.