#!/usr/bin/env node const { maxBy } = require('lodash') function lr(tree) { if (tree.length < 3 || tree[0] === '.') { return [[],[]] } if (tree.length === 3) { return [["."],["."]] } left=[] let [sm,ix] = [0,1] while (sm !== -1) { left.push(tree[ix]) sm+=(tree[ix] == '.' ? -1 : 1) ix+=1 } return [left,tree.slice(left.length+1)] } function lrLongPath(tree) { if (tree[0] === '.') { return [[],[]] } if (tree.length === 3) { return [[tree[0]],[tree[0]]] } return lr(tree).map( ar => [tree[0], ...maxBy(lrLongPath(ar), x => x.length)] ) } function biLongPath(tree) { if (tree.length < 3 || tree[0] == '.') { return [] } if (tree.length === 3) { return [tree[0]] } let [lPath,rPath] = lrLongPath(tree) let path = [...([...(lPath.slice(1))].reverse()),...rPath] let [left,right] = lr(tree) return maxBy([path, ...[left,right].map(biLongPath)], x => x.length) } console.log(biLongPath(process.argv.slice(2)).join(" ")) /* run