Estoy construyendo un juego de palabras. Una de las funciones que necesito es una función que recibe una palabra y reemplaza varias palabras con (_) y da la palabra incompleta como salida. Quiero que se reemplace la cantidad de palabras y que la ubicación de esas palabras se elija al azar. El código que escribí, aunque usa for, solo puede reemplazar una palabra. ¿Qué cambios debo hacer en la parte for del código que tiene la capacidad de mover varias palabras? por ejemplo: "portátil" => "l_pt_p"
function wordToIncomplete(word) { let randomNumber = Math.floor(Math.random() * 3) + 1 let _randomNumber = Math.floor(Math.random() * word.length) let _word = ""; for (let index = 0; index < randomNumber; index++) { _word = word.replace(word[_randomNumber], '_'); } return _word }El ejemplo devuelve una matriz de letras con la que es más fácil trabajar, pero si por algún motivo desea una cadena, haga lo siguiente en la última línea:
return chars.join(''); Nota: este ejemplo en realidad ajusta dinámicamente la cantidad de letras que se reemplazarán, que es del 30% al 60% de word.length .
Los detalles se comentan en el ejemplo a continuación.
// Utility function const log = data => console.log(JSON.stringify(data)); // Random integer range function const randRng = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; const fragWord = word => { /* The result of the following expressions is a random number that's within the range of 30% to 60% of total length of >word< >word< string is converted into an array of letters called >chars< */ const size = word.length; const lo = Math.ceil(0.3 * size); const hi = Math.ceil(0.6 * size); let qty = randRng(lo, hi); let chars = word.split(''); /* At each iteration of >chars< a random index number is generated. If there's a '_' at that index, the current iteration is skipped and qty increases by 1 to compensate. Otherwise the letter at that index is replaced with a '_' */ skip: for (let i = 0; i < qty; i++) { let index = randRng(0, size - 1); let char = chars.at(index); if (char === '_') { qty = qty + 1; continue skip; } chars[index] = '_'; } return chars; }; log(fragWord('fragment')); log(fragWord('appearance')); log(fragWord('institutionalization')); log(fragWord('institutionalization'));Creo que su problema es que no puso su _randomNumber en el ciclo para volver a generar su índice de caracteres eliminado
function wordToIncomplete(word) { let randomNumber = Math.floor(Math.random() * 3) + 1 let _word = word; for (let index = 0; index < randomNumber; index++) { let _randomNumber = Math.floor(Math.random() * _word.length) _word = _word.replace(_word[_randomNumber], '_'); } return _word } const testingWords = "testing words" console.log(wordToIncomplete(testingWords))Pero con esta solución, creo que encontrará otro problema que puede verificar el mismo carácter que ya se reemplazó anteriormente.
Por lo tanto, modifiqué un poco tu código con while loop
function wordToIncomplete(word) { let randomNumber = Math.floor(Math.random() * 3) + 1 let _word = word; let index = 0; while (index < randomNumber) { let _randomNumber = Math.floor(Math.random() * _word.length) if (_word[_randomNumber] === '_') { // we don't need to replace the checked words continue; } _word = _word.replace(_word[_randomNumber], '_'); index++; } return _word } const testingWords = "testing words" console.log(wordToIncomplete(testingWords)) Por cierto, tampoco le asignaste valor a _word , así que lo cambié a
let _word = wordSí, como mencionó @Barmar, nombrar es importante.
¿Qué cambios debo hacer en la parte for del código que tiene la capacidad de mover varias palabras?
El problema aquí es que _randomNumber siempre es el mismo durante el ciclo.
function wordToIncomplete(word) { const randomNumberOfCharactersToBeReplaced = Math.floor(Math.random() * word.length) + 1; let result = word; for (let i = 0; i < randomNumberOfCharactersToBeReplaced; i++) { // suppose we don't care about whether the character is already replaced or not. const randomIndexToBeReplaced = Math.floor(Math.random() * word.length); result[randomIndexToBeReplaced] = "_"; } return result; }