# Generating a powerset in ColdFusion

I recently needed to generate a powerset (a set of all subsets) of 3 HTML select boxes. The idea was that a user could choose 1-many options from each box, and they had to choose a value from all 3 boxes (none could be empty).

Now, I needed to generate every possible permutation for these 3 select boxes based on the rules I defined above. That meant the possible number of combinations for each box was:

Select #1 had 16* possible combinations
Select #2 had 128* possible combinations
Select #3 had 8192* possible combinations

* It was actually 1 less than that, because a powerset take into consideration an empty selection, so in reality the numbers would have been 15, 127 and 8191.

This was calculated using 2n, where n is an number (integer) of options in a set, so 24, 27 and 213

Now, how did I go about calculating these powersets? I cheated :smile:

I grabbed a JavaScript function from Rosetta Code and ported it to ColdFusion.

Here is the function to generate a powerset from a set (array) of data:

``````public array function calculate(required array data)
{
var ps = [""];
var d = arguments.data;
var lenData = arrayLen(d);
var lenPS = 0;
for (var i=1; i LTE lenData; i++)
{
lenPS = arrayLen(ps);
for (var j = 1; j LTE lenPS; j++)
{
arrayAppend(ps, listAppend(ps[j], d[i]));
}
}
return ps;
}
``````

A sample powerset of 4 values (in this case 1,2,3,4) would be:

``````var Powerset = new Powerset();
var res = Powerset.calculate([1,2,3,4]);

Outputs:
["","1","2","1,2","3","1,3","2,3","1,2,3","4","1,4","2,4","1,2,4","3,4","1,3,4","2,3,4","1,2,3,4"]
``````

By the way, my total combination across all 3 sets was a mere 16,777,216.

Grab from github if you prefer the CFC