Combinaciones de N elementos tomados de K en K: fórmulas con REDUCE y LAMBDA
Sebas comparte un archivo con un listado de 11 elementos y necesita generar todas las combinaciones posibles tomados de 2 en 2 (sin repetición, sin importar orden). Nacho aporta una primera solución, y Frankikoh78 comparte una fórmula propia con MAP + DIVIDIRTEXTO + TEXTOANTES + TEXTODESPUES para generar pares.
Pero Leo lleva el problema a otro nivel con una colección completa de fórmulas para permutaciones, variaciones y combinaciones.
Combinaciones de N tomados de K en K (la que pedía Sebas):
``
=LET(
l; A2:A12;
n; FILAS(l);
k; 2;
d; n-k;
r; REDUCE(SECUENCIA(d+1); SECUENCIA(k-1;;2);
LAMBDA(x;y; LET(
m; APILARH(SECUENCIA(FILAS(x);;1;0); x+1);
REDUCE(m; SECUENCIA(d;;d;-1);
LAMBDA(a;b; LET(
p; ENTERO(COMBINAT(b+y-1;y-1));
c; TOMAR(a;-p);
APILARV(a; FILTRAR(c+1; NO(TOMAR(c+1;;-1)>MAX(c))))
))
)
))
);
INDICE(l;r)
)
`
Con solo cambiar la variable k se obtienen combinaciones de 3, 4 o más elementos. Leo también comparte una versión para combinaciones CON repetición usando BASE y HEX.A.DEC:
`
=LET(
l; A2:A12;
k; 3;
n; FILAS(l);
i; HEX.A.DEC(
EXTRAE(BASE(SECUENCIA(n^k;;0); n; k); SECUENCIA(;k); 1)
) + 1;
INDICE(l;i)
)
`
Y una versión más corta para combinaciones sin repetición cuando k ≤ 9:
`
=LET(
l; A2:A12;
k; 2;
n; FILAS(l);
s; SECUENCIA(;n)&"";
INDICE(l;
EXTRAE(
REDUCE(""; SECUENCIA(k);
LAMBDA(a;b; ENCOL(SI.CONJUNTO(DERECHA(a)<s; a&s); 3))
);
SECUENCIA(;k); 1
)
)
)
`
Las tres fórmulas generan los mismos resultados que la función COMBINAT` predice, pero devuelven las combinaciones reales, no solo el conteo.
El reto: generar todas las combinaciones, no solo contarlas
Sebas trajo a la comunidad un problema típico de combinatoria. Tiene un listado de 11 elementos y necesita todas las combinaciones posibles tomadas de 2 en 2: sin repetición y sin que importe el orden. La función COMBINAT te dice cuántas hay, pero no las genera. El reto era producir las combinaciones reales, listadas una por fila.
Nacho aportó una primera solución y Frankikoh78 compartió otra con MAP, DIVIDIRTEXTO, TEXTOANTES y TEXTODESPUES para armar los pares. Pero Leo llevó el problema a otro nivel con una colección de fórmulas para permutaciones, variaciones y combinaciones.
Combinaciones de N tomados de K en K
Esta es la que pedía Sebas. Lo potente es que funciona para cualquier k: cambias esa variable y obtienes combinaciones de 2, 3, 4 o más elementos.
=LET(
l; A2:A12;
n; FILAS(l);
k; 2;
d; n-k;
r; REDUCE(SECUENCIA(d+1); SECUENCIA(k-1;;2);
LAMBDA(x;y; LET(
m; APILARH(SECUENCIA(FILAS(x);;1;0); x+1);
REDUCE(m; SECUENCIA(d;;d;-1);
LAMBDA(a;b; LET(
p; ENTERO(COMBINAT(b+y-1;y-1));
c; TOMAR(a;-p);
APILARV(a; FILTRAR(c+1; NO(TOMAR(c+1;;-1)>MAX(c))))
))
)
))
);
INDICE(l;r)
)La fórmula construye los índices de las combinaciones con dos REDUCE anidados y COMBINAT para dimensionar cada bloque, y al final INDICE traduce esos índices a los elementos reales de la lista.
Combinaciones con repetición: BASE y HEX.A.DEC
Leo también resolvió el caso de combinaciones con repetición con un truco precioso: interpretar cada combinación como un número en base N. Genera todos los números del rango, los convierte a base N con BASE, y extrae cada dígito para usarlo como índice:
=LET(
l; A2:A12;
k; 3;
n; FILAS(l);
i; HEX.A.DEC(
EXTRAE(BASE(SECUENCIA(n^k;;0); n; k); SECUENCIA(;k); 1)
) + 1;
INDICE(l;i)
)Una versión corta para k pequeña
Para combinaciones sin repetición cuando k es pequeña, Leo comparte además una fórmula más breve que va construyendo las cadenas de índices con un REDUCE sobre SECUENCIA(k), apoyándose en ENCOL y SI.CONJUNTO para quedarse solo con las combinaciones válidas (aquellas cuyos índices van en orden ascendente, lo que evita duplicados y repeticiones). Es la más compacta de las tres, ideal cuando no necesitas generalidad total.
Funciones clave
REDUCE: el motor que va acumulando los bloques de combinaciones paso a paso.COMBINAT: no genera las combinaciones, pero dimensiona cuántas hay en cada tramo.SECUENCIA: produce los rangos de índices sobre los que itera todo.BASEyHEX.A.DEC: el truco para el caso con repetición, tratando cada combinación como un número.INDICE: convierte los índices generados en los elementos reales de la lista.
Conclusión
Pasar de "sé cuántas combinaciones hay" a "aquí están todas, listadas" es un salto que antes obligaba a VBA o a tablas auxiliares enormes. Estas fórmulas lo resuelven en una celda y, cambiando una variable, sirven para combinaciones de cualquier tamaño. Es matemática pura convertida en fórmula, y el tipo de reto que la comunidad de Influexcel disfruta llevando al límite.
Más casos con estas funciones
Más contenido de Excel en InflueXcel
- Error #CALC! con MAP y AGRUPARPOR: solución con REDUCE+APILARV CasoNuevo reto de Excel resuelto por la comunidad: un usuario necesita aplicar AGRUPARPOR de forma iterativa sobre un rango de códigos de cuenta
- Cálculos iterativos con REDUCE y APILARV en Excel CasoLa comunidad aborda un caso sobre cómo trabajar con bucles iterativos en Excel usando funciones modernas. Un miembro necesita realizar cálcu
- Descomposición de Cholesky con matrices dinámicas: de VBA a LAMBDA+REDUCE CasoJuan Pablo lanza un reto al grupo: tiene una descomposición de Cholesky resuelta con VBA y quiere saber si se puede hacer con matrices dinám
- Filtro multicriteria dinámico con LET, FILTRAR y LAMBDA CasoHéctor comparte con la comunidad una fórmula avanzada para filtrar una tabla de productos/servicios por múltiples criterios opcionales (clav
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- Distribución equitativa con LAMBDA, REDUCE y ALEATORIO CasoHéctor plantea la necesidad de repartir un conjunto de líneas (tareas, actividades) entre varios grupos de forma equitativa y aleatoria. Ide
- Repetir valores N veces: tres enfoques con REDUCE, SCAN y ARCHIVOMAKEARRAY CasoJoan Recasens plantea un problema clásico: tiene una lista de categorías (A, B, C) con el número de repeticiones de cada una (4, 2, 3) y qui
- Filtrar una tabla por una lista de valores: una LAMBDA propia y su inversa TutorialTe pasan una lista de 30 números de albarán y hay que sacar esas filas de una tabla de miles. Con el autofiltro es marcar casillas una a una
- Despivotar una tabla cruzada con fórmulas: SCAN+GROUPBY vs TEXTSPLIT+TOROW CasoUn miembro comparte un fichero con datos en formato tabla cruzada: 4 proyectos en filas, 12 meses en columnas, cada mes con dos sub-columnas
- Contar los días de contrato temporal por empresa en Excel TutorialLa reforma laboral limita a 90 los días que una empresa puede tener a alguien contratado de forma temporal, y controlarlo a mano es un infie