JSFiddle - React, Tailwind, and code Playground

by jrab227

JavaScript

var store = {}

function generateGadgets(gadget){
    if (gadget.length == 0){
        return []   
    }
    
    if (store[gadget.toString()]){
        return store[gadget.toString()]
    }
    
    var result = gadget.map(function(num, index){
        return {
            'prefix': [combine(gadget.slice(0, index+1))],
             'rest': generateGadgets(gadget.slice(index+1))
        }
    })
    .reduce(function(agg, next){
        if (next.rest.length == 0){ return agg.concat([next.prefix]) }
        
        return agg.concat(
            next.rest.map(function(tail){
                return next.prefix.concat(tail)
            })
        )
    }, [])
    
    store[gadget.toString()] = result
    
    return result
}

function combine(gadget){
    return parseFloat(gadget.reduce(function(agg, next){
        return agg.concat(next.toString())
    }, ''))
}

function generateArithmetic(gadget){
    if (gadget.length == 0){ return []}
    if (gadget.length == 1){ return [gadget[0].toString()] }
    var tails = generateArithmetic(gadget.slice(1))
    return tails.map(function(tail){
        return [gadget[0] + '+' + tail , gadget[0] + '-' + tail]
    }).reduce(function(agg, next){ return agg.concat(next) }, [])
}

var solutions = generateGadgets([1, 2, 3, 4, 5, 6, 7, 8, 9])
.map(generateArithmetic)
.reduce(function(agg, expressions){ return agg.concat(expressions) }, [])
.filter(function(expression){ return eval(expression) == 100 })

console.log(solutions.map(function(exp){ return {'exp': exp, 'soln': eval(exp)}}))