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.
  • BASE y HEX.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