1
var findNumOfValidWords = function (words, puzzles) {2
// Form map of word's bitmasks3
const wordsMaskMap = words.reduce(4
(map, word) => addToMap(map, getMask(word)),8
return puzzles.map((puzzle) => {9
const pMask = getMask(puzzle);10
const pFirstMask = getFirstMask(puzzle);13
// Verify each bitmask against a given puzzle14
for (let wMask of wordsMaskMap.keys()) {15
if (wMask & pFirstMask && !((wMask | pMask) ^ pMask)) {16
count += wordsMaskMap.get(wMask);23
// Transform a char into a bit index24
var getBit = (char) => 1 << (char.charCodeAt(0) - "a".charCodeAt(0));26
// Transform a word into a bitmask27
var getMask = (word) => word.split("").reduce((acc, c) => acc | getBit(c), 0);29
// Get a bitmask for the first letter of a word30
var getFirstMask = (word) => getBit(word[0]);32
// Helper function to count hashes in a Map object33
var addToMap = (map, val) =>34
map.has(val) ? map.set(val, map.get(val) + 1) : map.set(val, 1);