{
let { start, formulas } = parse(puzzle)
let depth = 40
let count = {}
let pairs = {}
Array(...new Set(Object.values(formulas))).forEach(v => count[v] = 0)
Object.keys(formulas).forEach(v => pairs[v] = 0)
d3.pairs(Array.from(start)).forEach(p => {
pairs[p[0]+p[1]] += 1
})
Array.from(Array(depth)).forEach(step =>{
let newPairs = {}
Object.keys(formulas).forEach(v => newPairs[v] = 0)
Object.entries(pairs).forEach(([pair, cnt]) =>{
const p1 = pair[0]+formulas[pair]
const p2 = formulas[pair]+pair[1]
newPairs[p1] += cnt
newPairs[p2] += cnt
})
})
Object.entries(pairs).forEach(([pair, cnt]) => {
count[pair[0]] += cnt
count[pair[1]] += cnt
})
Object.entries(count).map(([char, cnt]) => count[char] = Math.ceil(cnt/2))
let result = (d3.max(Object.values(count)) - d3.min(Object.values(count)))
return { result, pairs, count, depth, start, formulas }
}