Tengo este código que devuelve el producto cartesiano de tres matrices:
function getcartesianProduct(symbols: Array<string>) { const cartesian = <T,>(...sets: T[][]) => sets.reduce<T[][]>((accSets, set) => accSets.flatMap(accSet => set.map(value => [...accSet, value])), [[]]); return cartesian(symbols, symbols, symbols).map((items: Array<string>) => items.join("")); }Por ejemplo, así:
>> const numbers: Array<string> = "0123456789".split(""); >> getcartesianProduct(numbers).slice(0, 5) ["000", "001", "002", "003", "004"] Sin embargo, no siempre quiero que mi serie de números esté formada por tres números. A veces, quiero cuatro, cinco o cualquier otro número. Es por eso que me gustaría tener un argumento que llenara los argumentos dentro de la llamada a la función cartesian() , en consecuencia.
Me imagino algo como esto:
function getcartesianProduct(symbols: Array<string>, n: number) { const cartesian = <T,>(...sets: T[][]) => sets.reduce<T[][]>((accSets, set) => accSets.flatMap(accSet => set.map(value => [...accSet, value])), [[]]); return cartesian(symbols * 3).map((items: Array<string>) => items.join("")); }¿Cómo puedo hacer eso, por favor? Cada ayuda es apreciada.
Creo que algo como esto debería funcionar:
function getcartesianProduct(symbols: string[], nrOfArrays: number) { const cartesian = <T,>(sets: T[][]) => sets.reduce<T[][]>((accSets, set) => accSets.flatMap(accSet => set.map(value => [...accSet, value])), [[]]); return cartesian<string>(new Array(nrOfArrays).fill(symbols)).map((items: string[]) => items.join("")).slice(0, nrOfArrays); } const numbers = "0123456789".split(""); console.log(getcartesianProduct(numbers, 5))