JavaScript
// Inputs
var prefixes = [0, 6, 6, 8, 8, 8, 8, 8, 8, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 15, 15, 18, 18, 18, 18, 18, 18, 23],
suffixes = [0, 3, 3, 9, 11, 11, 11, 17, 18, 18, 20, 25, 25, 27, 30, 30],
expected_result = 42;
// Associative Arrays
var prefixTotals = {},
suffixTotals = {},
// Functions
addTotal = function( map, arr, other_map ){
var t = 0, i = 0;
for ( ; i < arr.length; ++i )
t += arr[i].value;
if ( ( other_map === undefined )
|| ( ( expected_result - t ) in other_map ) )
{
if ( !( t in map ) )
map[t] = [];
map[t].push( arr );
}
},
calcPermutations = function( affixes, map, other_map ) {
var i = 0, j, k, l = affixes.length;
for ( ; i < l; ++i )
{
addTotal( map, [ { index: i, value: affixes[i] } ], other_map );
for ( j = i+1; j < l; ++j )
{
addTotal( map, [ { index: i, value: affixes[i] }, { index: j, value: affixes[j] } ], other_map );
for ( k = j+1; k < l; ++k )
{
addTotal( map, [ { index: i, value: affixes[i] }, { index: j, value: affixes[j] }, { index: k, value: affixes[k] } ], other_map );
}
}
}
},
resultToString = function( affixes ){
var s = [];
for ( var i = 0; i < affixes.length; ++i )
s.push( affixes[i].index + '=>' + affixes[i].value );
return s.join(',');
};
calcPermutations( prefixes, prefixTotals, undefined );
calcPermutations( suffixes, suffixTotals, prefixTotals );
var i,j,k,p,s,count = 0,html=[];
for ( i in suffixTotals )
{
s = suffixTotals[i];
p = prefixTotals[expected_result - i];
for ( j = 0; j < p.length; ++j )
for ( k = 0; k < s.length; ++k )
html.push( 'Prefixes [' + resultToString( p[j] ) + '], Suffixes [' + resultToString( s[k] ) + ']' );
...