DEV Community

Discussion on: Daily Challenge #211 - Product Partitions

Collapse
 
mellen profile image
Matt Ellen • Edited

Javascript

function parts(n, primeSearch=false)
{
    let factors = [...Array(n-1)].map((e, i) => i+1).filter(x => n%x == 0)
    factors.splice(0,1);
    let count = factors.length;
    if(count === 0)
    {
        return [0, []];
    }

    if(primeSearch)
    {
        return [1,[]]
    }

    let factorParts = factors.map(factor => [factor, n/factor].sort((a,b) => a-b))
        .concat(factors
                .filter(factor => parts(factor, true)[0] !== 0)
                .map(factor =>
                     {
                         let fp = parts(factor);
                         fp[1].push(n/factor);
                         return fp[1].sort((a,b) => a-b);
                     })).sort();    

    let resultFactors = [];

    for(let fli = 0; fli < factorParts.length-1; fli++)
    {
        let fl1 = factorParts[fli];
        let fl2 = factorParts[fli+1];

        if(fl1.length != fl2.length)
        {
            resultFactors.push(fl1);
            continue;
        }

        let diffsum = 0;

        for(let fi = 0; fi < fl1.length; fi++)
        {
            diffsum += fl1[fi] - fl2[fi];
        }

        if(diffsum !== 0)
        {
            resultFactors.push(fl1);
        }
    }

    resultFactors.push(factorParts[factorParts.length-1]);
    resultFactors.sort((l1, l2) => l2.length - l1.length);
    return [resultFactors.length, resultFactors[0]];
}