Supongamos que tengo una palabra "FadTheChad" (o cualquier palabra que tenga vocales) y quiero que las vocales se reemplacen con "*" y devuelva todas las posibilidades (¿subconjuntos? No estoy seguro de cómo podría describirlo) de la palabra en una matriz.
Intenté usar String.replace() en toda la cadena que me dio F*dTh*Ch*d
. Luego intenté recorrer la cadena y hacer .replace() nuevamente, lo que devolvió F*dTheChad, FadTh*Chad, FadTheCh*d
.
¿Hay alguna forma de que pueda obtener algo como
[ 'F*dTh*Ch*d', 'F*dTheChad', 'F*dTh*Chad', 'F*dTheCh*d', 'FadTh*Chad', 'FadTh*Ch*d', 'FadTheCh*d' ]
Prueba esto:
function getPossibilities(word) { let vowels = ['a', 'e', 'i', 'o', 'u']; // 'y'? let positions = []; for (let i = 0; i < word.length; i++) { if (vowels.indexOf(word[i]) !== -1) positions.push(i); } let result = [], count = 2 ** positions.length; for (let i = 0; i < count; i++) { let newWord = [...word]; for (let j = 0; j < positions.length; j++) { if ((i >> j) & 1) newWord[positions[j]] = '*'; } result.push(newWord.join('')); } return result; }
Convierto la palabra en una matriz porque en JS las cadenas son inmutables, por lo que no podría modificar índices como este.
Bien, ahora que entiendo la pregunta antes de responderla (consulte el original a continuación para obtener una explicación), esto también se puede responder con una simple recursión:
const addAsterisks = ([c,...cs]) => c == undefined ? [''] : addAsterisks (cs) .flatMap ( (w) => 'aeiou' .includes (c) ? [c + w, '*' + w] : [c + w] ) console .log (addAsterisks ('FadTheChad'))
.as-console-wrapper {max-height: 100% !important; top: 0}
Si la cadena está vacía, devolvemos una matriz que contiene la cadena vacía. De lo contrario, recurrimos al resto de la cadena y, para cada resultado, devolvemos una matriz con nuestro carácter actual antepuesto al resultado y, si el carácter actual es una vocal, un asterisco antepuesto al resultado.
( Esto respondió a una pregunta completamente diferente, en base a mi lectura errónea. Todavía es interesante por derecho propio).
Una simple recursividad lo hace fácil:
const addVowels = (str) => str .indexOf ('*') < 0 ? str : ['a', 'e', 'i', 'o', 'u'] .flatMap (v => addVowels (str .replace ('*', v))) console .log (addVowels ('F*dTh*Ch*d'))
.as-console-wrapper {max-height: 100% !important; top: 0}
Si nuestra cadena no contiene asteriscos, hemos terminado y simplemente la devolvemos.
Si tiene un asterisco, flatMap
ping a los resultados de reemplazarlo con cada una de las vocales y repetirlo en la cadena resultante.
Para la próxima vez, incluya un código de muestra para lo que ha probado.
Entonces, la pregunta es encontrar las vocales, luego encontrar todas las combinaciones posibles reemplazándolas con estrella ... bastante bien, así que aquí está mi intento
function vowelOptions(text,replacer){ let isVowel={a:1,e:1,i:1,o:1,u:1} let vowels=[], toReturn=[] let data=text.split('') data.forEach((letter,i)=>{ if(isVowel[letter]){vowels.push(i)} //location of vowel stored }) for(let i=1;i<Math.pow(2,vowels.length);i++){ //Math.pow(2,vowels.length) are the number of vowel possibilities //i=1 and NOT 0 because default text is now allowed in return let dataOption=[...data] //a clone with a possible combination let combination=i.toString(2).split('').reverse() //the ones that will be '1' tell me where to put the replacer combination.forEach((bool,j)=>{ if(bool=='1'){dataOption[vowels[j]]=replacer} //vowels to replace in this combination replaced thanks to vowel locations saved above }) toReturn.push(dataOption.join('')) } return toReturn } //now watch it work >:} console.log(vowelOptions("FadTheChad","*"))