Forum Discussion
Patrick2788
Oct 28, 2022Silver Contributor
LAMBDA Halloween Challenge
PeterBartholomew1 SergeiBaklan mtarler Goal: generate an array of all possible combinations (w/repetitions) from a list of items. For example, if there are 6 total items with 4 chosen (allowing...
- Oct 30, 2022
Finally, I have a solution!
This time I used a Lambda function to add 1 to the previous index (stored in base n) but before returning the value, I scanned the digits and copied the larger digit across.
WorksheetFormula = LET( count, COUNTA(Items), initialise, REPT("0",pick), indices, VSTACK( initialise, SCAN(initialise, SEQUENCE(combinations-1), NextCombinationλ(count,pick)) ), INDEX(Items, 1 + Explodeλ(indices)) )
where
NextCombinationλ = LAMBDA(n,p, LAMBDA(initial,s, LET( place, n^SEQUENCE(1,p,p-1,-1), increment, 1 + SUM(place * Explodeλ(initial)), converted, BASE(increment,n,p), vector, Explodeλ(converted), modified, SCAN( , vector, Maxλ), CONCAT(modified) ) ) );
supported by
Explodeλ = LAMBDA(term, MID(term, SEQUENCE(1,pick), 1)); Maxλ = LAMBDA(u, v, Max(u,v));
I have just performed the calculation for 8 picks taken for 9 items in 300ms. Ther are 12,870 combinations and the permutations would have been over 43M!
PeterBartholomew1
Oct 29, 2022Silver Contributor
This is somewhat lacking in mathematical refinement. I generated the permutations and then sorted and removed duplicates. I don't know what the size limitations might be.
Patrick2788
Oct 30, 2022Silver Contributor
This is a clever solution. I'm still unpacking your formula and the use of BASE to generate the numbering. I was able to generate 3,003 combinations. It seems anything beyond that is something SEQUENCE won't calculate.