Dada la cadena nums que contiene solo dígitos y la matriz de números predefinedNumbers , tengo que construir una nueva cadena, basada en nums pero donde cada número entre dos puntos tiene que ser un número válido de predefinedNumbers y devolver todas las posibilidades.
Ejemplo de entrada:
nums = "143163421154143" predefinedNumbers = ["21154", "143", "21154143", "1634", "163421154"]Salida deseada:
[ ":143:1634:21154:143:", ":143:163421154:143:", ":143:1634:21154143:" ]Hasta ahora probé este código, pero no es el resultado que necesito y estoy atascado tratando de entender cómo revisarlo de forma recursiva:
let nums = "143163421154143"; predefinedNumbers = ["21154", "143", "21154143", "1634", "163421154"]; let newArray=[]; function makeNumSentences (nums, predefinedNumbers) { predefinedNumbers.map(item => { if (nums.includes(item)) { newArray.push(item) } }) console.log(newArray.join(':')); }; makeNumSentences("143163421154143",["21154", "143", "21154143", "1634", "163421154"])Cualquier pista es muy apreciada.
Tenga en cuenta que los bucles nunca terminarán en caso de que los nums no estén compuestos únicamente por predefinedNumbers .
const nums = "143163421154143"; const predefinedNumbers = ["21154", "143", "21154143", "1634", "163421154"]; const result = []; function makeNumSentences(nums) { check([], nums); console.log(result); }; function check(array, nums) { predefinedNumbers.forEach(e => { if (nums.startsWith(e)) { const newArray = array.concat(e); const newNums = nums.slice(e.length); if (newNums) { check(newArray, newNums); } else { result.push(newArray.join(':')); } } }); } makeNumSentences(nums);Primero, lea ¿Cómo hago y respondo preguntas sobre la tarea? .
Sin embargo, dado que ya hay una respuesta aceptada, solo mostraré una técnica alternativa. El hecho de que los elementos sean dígitos no tiene sentido. Esta misma técnica funcionará para cualquier cadena. (Existen técnicas matemáticas para encontrar el valor correcto, pero desbordarían rápidamente los números normales y, dado que la salida debe ser una cadena en cualquier caso, parece que no hay necesidad de buscarlas).
Pensando en esto recursivamente, podemos dividirlo en dos partes. ¿Cuáles de mis valores predefinidos aparecen al comienzo de mi cadena de destino? Y para cada uno de ellos, ¿cómo realizo la misma operación en el resto de la cadena? Una recursión necesita un caso base, y podemos decir que si la cadena de destino está vacía, entonces podemos devolver una sola cadena vacía.
Podemos implementarlo así:
const make = (target, sources) => target .length == 0 ? [[]] : sources .filter (s => target .startsWith (s)) .flatMap (s => make (target .slice (s .length), sources) .map (r => [s, ...r])) const makeNumSentences = (target, parts) => make (target, parts) .map (r => `:${r.join(':')}:`) const nums = "143163421154143" const predefinedNumbers = ["21154", "143", "21154143", "1634", "163421154"] console .log (makeNumSentences (nums, predefinedNumbers)) Observe el desglose en una función recursiva principal, que devuelve una matriz de matrices de elementos de nuestras fuentes ( [["143", "1634", "21154", "143"], ["143", "1634", "21154143"], ["143", "163421154", "143"]] ) y un contenedor que los combina en el formato de salida. ( [":143:1634:21154:143:", ":143:1634:21154143:", ":143:163421154:143:"] ). En mi opinión, este es el desglose adecuado de la obra. Es agradable trabajar con matrices y podemos hacer mucho más con ellas. Pero este no es el único camino a seguir. Podemos modificar esto para devolver las cadenas directamente:
const make = (target, sources) => target .length == 0 ? [''] : sources .filter (s => target .startsWith (s)) .flatMap (s => make (target .slice (s .length), sources) .map (r => `:${s}${r}` + (r ? '' : ':'))) const nums = "143163421154143" const predefinedNumbers = ["21154", "143", "21154143", "1634", "163421154"] console .log (make (nums, predefinedNumbers)) Tenga en cuenta que hay cierta complejidad adicional aquí en la construcción de las cadenas. Esto se debe al final " : ". Queremos agregar eso solo en el primer paso cuando la cadena existente está vacía. (Siempre añadimos el primero.)