Putting It All Together es-419 Explainer

Explicación de Juntando todo

Objetivo de este acertijo: Buscar la subsecuencia más larga del string de un arreglo.

Tutorial de la solución: El esquema general para resolver este acertijo es esto:

  1. Crea un mapa de string
  2. Crea un nuevo arreglo para almacenar subsecuencias válidas
  3. Cicla por todos los strings en el arreglo (dictionary)
  4. Verifica si cada string es una subsecuencia válida
  5. Si lo es, agrégalo al nuevo arreglo que creaste
  6. Por último, usa la función longestWord() para devolver la subsecuencia válida más larga del nuevo arreglo

La creación del mapa es simple porque ya creaste una función para él: mapString(). Almacena el resultado en una nueva variable; puedes llamarla map.

La creación de un nuevo arreglo para almacenar cualquier coincidencia es similar: let listOfSubsequences = []. Esto puede permanecer vacío, porque lo llenaremos hasta 1 a la vez dentro del ciclo.

Un for of loop funcionará bien para verificar cada uno de los strings en el arreglo: for (let word of dictionary) {...}

La función isSubsequence() del acertijo anterior es útil ahora. Necesita 2 argumentos: un string y un object de map, luego devolverá si el string es una subsecuencia de ese object de map (o bien, el string al que representa el mapa). Dado que la función devuelve true o false, tiene sentido usarlo como una prueba en una if statement.

Si la prueba es verdadera, entonces word es una subsecuencia, y se debe agregar al arreglo listOfSubsequences. Eso se puede hacer usando el método .push().

A medida que el for loop continúa, agregará todas las subsecuencias válidas a listOfSubsequences. Una vez que tengamos esa lista, solo debemos devolver la subsecuencia más larga. Afortunadamente, creamos una función para eso: longestWord(). Después del ciclo, agrega return longestWord(listOfSubsequences).
Código adicional (código oculto que se ejecuta antes del código del acertijo):

let _longestWord = (words) => {
  let longestWord = '';
  for (let word of words) {
    if (word.length > longestWord.length) {
      longestWord = word;
    }
  }
  return longestWord;
};

let _createStringMap = (string) => {
  let stringMap = {};
  for (let i = 0; i < string.length; i++) {
    let letter = string[i];
    if (stringMap[letter]) {
      stringMap[letter].push(i);
    } else {
      stringMap[letter] = [i];
    }
  }
  return stringMap;
};

let _findNextIndex = (mappedIndices, nextUsableIndex) => {
  for (let index of mappedIndices) {
    if (index >= nextUsableIndex) {
      return index + 1;
    }
  }
  return false;
};

let _isSubsequence = (dictionaryWord, map) => {
  let nextUsableIndex = 0;
  for (let letter of dictionaryWord) {
    if (map[letter]) {
      nextUsableIndex = _findNextIndex(map[letter], nextUsableIndex);
      if (nextUsableIndex) {
      } else {
        return false;
      }
    } else {
      return false;
    }
  }
  return true;
};



defineModule(
    'subsequence.functions',
    {
        longestWord: _longestWord,
        mapString: _createStringMap, 
        findNextIndex: _findNextIndex,
        isSubsequence: _isSubsequence
    }
);

defineModule(
    'subsequence.words',
    {
        dictionary: ['art','vascular','avast','javas','vat'],
        stringSequence: 'javascript'
    }
);
8 Likes

hola soy nuevo y necesito ayuda ya intente todo lo que se me ocurre y no logro completar bien el problema por favor alguien me prodria ayudar

1 Like

Aquí la respuesta, me maté la verdad, difícil!

6 Likes

Lo hice igual que tu y no me funciona :c

Por fin lo pude resolver…

Uploading: JuntandoTodo.png…

Este código me funcionó bien

4 Likes

No olvides verificar las librerías.

2 Likes

¿Pudiste solucionarlo? A mi tampoco me funciona

Hola, tiene solucion este puzzle? yo no he podido resolverlo, lo he intentado todo

Tampoco me funcionaba pero remplacé Dictionary por WordList y me funcionó, espero que les sirva.

1 Like

si señor, este era el problema, mucha novatada.

Esta difícil. Chicos no se desanimen!

no todos los héroes llevan capa, :slight_smile: