Pregunta Cree una función que acepte una matriz de palabras como entrada.


Visto este desafío de pizarra en línea y parece que no puede resolverlo. ¡AYUDA!

Cree una función que acepte una matriz de palabras como entrada.

Su función debe devolver una matriz de todas las palabras que se pueden escribir utilizando letras del alfabeto a las que solo se puede acceder en una sola fila del teclado estándar estadounidense QWERTY.

Por ejemplo:

// given
let words = [ 'sup', 'dad', 'tree', 'snake', 'pet'];
keyboardWords(words);

// return
['dad', 'tree', 'pet'];

Y esto es lo lejos que he llegado.

const topKeys = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'];
const middleKeys = ['a', 's', 'd','f', 'g', 'h', 'j', 'k', 'l'];
const buttomKeys = ['z', 'x', 'c', 'v', 'b', 'n', 'm'];

let result = [];

let words = ['sup', 'dad', 'tree', 'snake', 'pet'];

for(let i in words) {
  let eachWord = words[i];

  eachWord.split('').forEach(function(c) {
    console.log(c);
  });

}

Llegué al punto en el que estoy imprimiendo cada palabra en la matriz pero no sé completamente qué método usar para ver si cada letra de las palabras en una única matriz son las teclas principales, las teclas centrales, etc.


6
2018-04-11 00:09


origen


Respuestas:


Ver Array.prototype.filter(), Set, Spread Syntax, String.prototype.toLowerCase()y Array.prototype.every() para más información.

// Input.
const input = [
  'ERUT', // top match
  'wdvrmg', // false
  'dsjf', // middle match
  '!^#@&^#', // false
  'CxmvN', // bottom match
  '53454', // false
  '' // false
]

// Match.
const match = (A, B) => [...A].every(x => B.has(x.toLowerCase()))

// Line Words.
const lineWords = words => words.filter(word => word.length && (
  
  // Top match.
  match(word, new Set(['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'])) ||
  
  // Middle match.
  match(word, new Set(['a', 's', 'd','f', 'g', 'h', 'j', 'k', 'l'])) ||
  
  // Bottom match.
  match(word, new Set(['z', 'x', 'c', 'v', 'b', 'n', 'm']))
  
))

// Output.
const output = lineWords(input)

// Proof.
console.log(output)


2
2018-04-11 01:19



Obviamente hay muchas maneras de hacer esto. Mi primera reacción sería hacer una tabla hash. No estoy seguro de que sea mejor que cualquiera de los otros, pero debería tener un rendimiento razonable y ser fácil de entender / escribir en una pizarra:

const rows = [
  ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'],
  ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'],
  ['z', 'x', 'c', 'v', 'b', 'n', 'm']
];

// make a quick hash
const hash = rows.reduce((acc, row, i) => (row.forEach(letter => acc[letter] = i + 1), acc), {})
let words = ['sup', 'dad', 'tree', 'snake', 'pet', "4545", "", "PoWer", '0'];

let result = []

words.forEach(word => {
  if (!word) return                     // degenerate cases i.e  '', 0, etc.
  let row = hash[word[0].toLowerCase()]
  if (row == undefined) return          // not letters we know about
  for (let i = 1; i < word.length; i++) {
    if (hash[word[i].toLowerCase()] !== row) return
  }
  result.push(word)
})

console.log(result)


1
2018-04-11 02:17



Probablemente deberías usar .filter para comprobar qué elementos de una matriz pasan una prueba en particular. Entonces usa every para ver qué palabras pasan:

const keyboardWords = (() => {
  const topKeys = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'];
  const middleKeys = ['a', 's', 'd','f', 'g', 'h', 'j', 'k', 'l'];
  const bottomKeys = ['z', 'x', 'c', 'v', 'b', 'n', 'm'];
  return (words) => {
    return words.filter((word) => {
      const chars = word.split('');
      return chars.every(char => topKeys.includes(char))
        || chars.every(char => middleKeys.includes(char))
        || chars.every(char => bottomKeys.includes(char))
    });
  };
})();

const input = [ 'sup', 'dad', 'tree', 'snake', 'pet'];
console.log(keyboardWords(input))


0
2018-04-11 00:13



Una de las muchas maneras en que puede manejarlo:

const topKeys = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'];
const middleKeys = ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'];
const bottomKeys = ['z', 'x', 'c', 'v', 'b', 'n', 'm'];

const keysets = [topKeys, middleKeys, bottomKeys];

function fn(words) {
	let result = [];

	for (let j = 0; j < words.length; j++) {
		let word = words[j];
		keysets.forEach(function (keyset) {
			if (test(word, keyset)) {
				result.push(word);
			}
		});
	}

	function test(word, keyset) {
		let ok = false;
		for (let i = 0; i < word.length; i++) {
			let char = word.charAt(i);
			ok = keyset.indexOf(char) > -1;
			if (!ok) {
				break;
			}
		}

		return ok;
	}

	return result;
}

let words = ['sup', 'dad', 'tree', 'snake', 'pet'];

let result = fn(words);

console.log(result);


0
2018-04-11 00:38