Título: Manejo de Strings Publicado por: _whiteBird en 21 Junio 2020, 04:15 am Hola, tengo un problema que necesito convertir un string a si misma cambiando las letras a mayúsculas o no en javascript ej
dada la string "string" que al aplicar una funcion nos retorne un array con todas las posibilidades Ej: [ String, sTring, stRing, strIng, ... String STring StRing ... STRING ] No pido que me lo hagan solo que me orienten ya que llevo toda una tarde y no avance nada Título: Re: Manejo de Strings Publicado por: @XSStringManolo en 21 Junio 2020, 11:38 am Busca el código de un programa de fuerza bruta o generador de diccionarios. Es más difícil de hacer de lo que parece xD.
Título: Re: Manejo de Strings Publicado por: Tryptophan en 21 Junio 2020, 13:06 pm Si queres armarlo, vas a necesitar un arbol. La raiz del arbol va a ser la palabra sin transformaciones y cada derivacion del arbol, es una combinacion posible.
Título: Re: Manejo de Strings Publicado por: Serapis en 21 Junio 2020, 22:26 pm No es tan complicado...
En primer lugar puesto que se quiere devolver en un array hay que precalcular el tamaño que él mismo tendrá. Dado que cada carácter tiene 2 variaciones (mayúscula minúscula), que no hay permutaciones de lugar y el tamaño del string... cantidad = 2^size(delString) Siendo la cadena: 'string' size=6; 2^6=64. Luego el array tendrá 64 ítems. La segunda parte, se resuelve en un bucle recursivo... usando grafos. Básicamente es un árbol binario. Nota que no es preciso usar ni construir ninguna estructura especial, más allá del array. Aunque tirando por un árbol binario, te sería más sencillo. La palabra tendrá un nodo raíz (pongamos '*'), que accede a la primera letra, es decir 's' y 'S' son sus dos nodos hijo. A su vez cada una de ellas tiene como nodos hijos a la siguiente letra en las dos versiones (mayúscula y minúscula). Te pongo la jerarquía, de nodos, el de la izquierda es un nodo ya añadido al árbol, los de la derecha son los hijos que se le añaden como hijos: Código: *= s|S <--- hijo izquierdo y derecho del nodo raíz. Nota que los dos últimos nodos no tienen hijos... Ahora si se recorre todas las posibilidades del árbol obtendrás las 64 combinaciones distintas (desprecia el nodo raíz para formar la combinación a la hora de pasarlo al array de destino). El problema de usar una estructura de árbol, es que empleará más espacio del strictamente necesario, ya que por ejemplo, al llegar al último nodo, n y N, cada uno de ellos tendrán por nodos finales 'g' y 'G', es decir se habrá añadido 32 nodos 'g' y 32 nodos 'G'. Estrictamente basta un array de una estructura simple con cada uno de esos nodos: Código: Estructura Nodo Luego se puede pasar como una cadena de texto, o un array de texto, el contenido de más arriba '*= s|S, s= t|T, S= t|T ..." , el caso es una función recibe y parsea dicho contenido al array Nodos() que se compone de la estructura nodo. Rellenando dicho array quedaría así: Código: nodos(0).Nombre = "*" Ahora con dciho array una función recorre recursivamente, tomando en cada ciclo el 'nombre' del nodo visitado, que se usa para ir concatenando la variación adecuada. La recursión finaliza cuando el nodo es terminal... Como cada nodo tiene 2 hijos (podrían tener 1 o más), se precisa tambén un bucle interno para dicho recorrido de hijos. La función de recorrido se invoca desde la que parsea la entrada, sería más o menos así: Código: Funcion Recorrer(nodo n, entero i, entero xWord, string parcial, array string Salida() ) La función que parsea el texto de entrada, lo dejo a tu esfuezo, pués se trata de 'desguazar' dicha cadena en sus nodos, y cada nodos en sus elementos, para generar el array de nodos. Se requieren dos bucles, en el primero se crea el array con los 13 nodos (0 a 12, el 0 es el raíz), aplicando nombre, indice (el mismo del contador del bucle), número de hijos y si es o no terminal. Es terminal si no tiene hijos (caso de 'g' y 'G'). En el segundo bucle, se rellenan los datos que no se conocían , esto es, los hijos, requiere una búsqueda. Por ejemplo: Sabiendo que 't' tiene como hijos a 'r' y a 'R', precisa buscar que posicón ocupan esos nodos 'r' y 'R', para terminar de rellenar los datos (es decir busca rel índice de ?????: Código: nodos(3).Hijos(0) = nodos(?????) // 'r' La funcion principal, invoca a dos, una para generar los nodos y luego para realizar el recorrido. Código: Array de String() = funcion CombinatoriaMayusMinus(string Palabra) La función que construye el array de la estructura 'nodo'... Nota que aquí tomamos la palabra entrada, sin generar las producciones comentadas al principio (dada la simplicidad de dichas producciones, es todo muy deducible). Código: Funcion ParseEntrada(string Palabra) Una captura: (nota que yo he dejado el 'nombre' de la raíz '*', con cada uno) (https://i.imgur.com/aCLDdpW.png) La salida completa sería: Citar *= s|S; s= t|T; S= t|T; t= r|R; T= r|R; r= i|I; R= i|I; i= n|N; I= n|N; n= g|G; N= g|G; g=; G= Nodo Inicial: * Nodos Finales: g, G 1 ---> *string 0 1 ---> *strinG 0 1 ---> *striNg 0 1 ---> *striNG 0 1 ---> *strIng 0 1 ---> *strInG 0 1 ---> *strINg 0 1 ---> *strING 0 1 ---> *stRing 0 1 ---> *stRinG 0 1 ---> *stRiNg 0 1 ---> *stRiNG 0 1 ---> *stRIng 0 1 ---> *stRInG 0 1 ---> *stRINg 0 1 ---> *stRING 0 1 ---> *sTring 0 1 ---> *sTrinG 0 1 ---> *sTriNg 0 1 ---> *sTriNG 0 1 ---> *sTrIng 0 1 ---> *sTrInG 0 1 ---> *sTrINg 0 1 ---> *sTrING 0 1 ---> *sTRing 0 1 ---> *sTRinG 0 1 ---> *sTRiNg 0 1 ---> *sTRiNG 0 1 ---> *sTRIng 0 1 ---> *sTRInG 0 1 ---> *sTRINg 0 1 ---> *sTRING 0 1 ---> *String 0 1 ---> *StrinG 0 1 ---> *StriNg 0 1 ---> *StriNG 0 1 ---> *StrIng 0 1 ---> *StrInG 0 1 ---> *StrINg 0 1 ---> *StrING 0 1 ---> *StRing 0 1 ---> *StRinG 0 1 ---> *StRiNg 0 1 ---> *StRiNG 0 1 ---> *StRIng 0 1 ---> *StRInG 0 1 ---> *StRINg 0 1 ---> *StRING 0 1 ---> *STring 0 1 ---> *STrinG 0 1 ---> *STriNg 0 1 ---> *STriNG 0 1 ---> *STrIng 0 1 ---> *STrInG 0 1 ---> *STrINg 0 1 ---> *STrING 0 1 ---> *STRing 0 1 ---> *STRinG 0 1 ---> *STRiNg 0 1 ---> *STRiNG 0 1 ---> *STRIng 0 1 ---> *STRInG 0 1 ---> *STRINg 0 1 ---> *STRING 0 Número de nodos: 13 Total de caminos: 126 Total de Salidas: 64 La opción de resolverlo con un árbol, es también adecuada, como te describí más arriba... pero elige el modelo que mejor veas factible de entender e implementar... Título: Re: Manejo de Strings Publicado por: @XSStringManolo en 21 Junio 2020, 23:06 pm Tengo que aprenderme esto xD
Guardado Título: Re: Manejo de Strings Publicado por: Emertech en 26 Junio 2020, 01:57 am Hola, tengo un problema que necesito convertir un string a si misma cambiando las letras a mayúsculas o no en javascript ej dada la string "string" que al aplicar una funcion nos retorne un array con todas las posibilidades Ej: [ String, sTring, stRing, strIng, ... String STring StRing ... STRING ] Hay 1 modo más sencillo basado en un método que hice hace tiempo. - Crear una matriz m * n, donde m = nro de combinaciones y n = nro de letras. - Separar la palabra en 2 filas (sea matriz bidimensional o 2 unidimensionales) separando cada letra en una columna de cada fila, la 1era con sus letras en mayúscula y la 2da con sus letras en minúscula. - Llenar la matriz m*n con la fila de letras minúsculas. - Reemplazar de derecha a izquierda las columnas de la matriz m*n con la fila de las letras mayúsculas intercalando cada columna empezando con el valor de 1 e incrementando este valor para las siguientes columnas con el doble del valor anterior (dejo unas imágenes en Excel para ilustrar). (https://i.ibb.co/F7B8tKc/mat01.png) - Dejo un código de prueba en c++ para demostrar lo que menciono que se puede hacer en javascript similar. (https://i.ibb.co/rxxWPM1/matrix.png) Código
Título: Re: Manejo de Strings Publicado por: Tachikomaia en 26 Junio 2020, 02:37 am A mí lo que se me ocurre es ir incrementando un "número binario" así:
000000 000001 000010 etc, de modo que un 0 representa una minúscula y 1 una mayúscula. Pero el código tendría que pensar cómo sería y no tengo ganas ni tanta capacidad de hacerlo. |