# JavaScript (ES6), 80 f=(l,k=[1])=>l+l==k+k||l[k.length]&&f(l,k.concat(k))|f(l,k.concat(k.map(v=>-v))) Recursively builds and check each list up to the length of the input list, starting with `[1]`. Return value is JS truthy or falsey, specifically `1` or `true` if valid, `0` or `false` or `undefined` if not valid. **Test** <!-- begin snippet: js hide: false console: true babel: false --> <!-- language: lang-js --> f=(l,k=[1])=>l+l==k+k||l[k.length]&&f(l,k.concat(k))|f(l,k.concat(k.map(v=>-v))) test=`[] -> False [1] -> True [-1] -> False [1, 1] -> True [1, -1] -> True [1, 1, 1, 1] -> True [1, 1, 1, 1, 1] -> False [1, -1, -1, 1, -1, 1, 1, -1] -> True [1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1] -> False [1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1] -> False [1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1] -> True` .split('\n') test.forEach(r=>{ input = r.match(/-?1/g)||[] check = r.slice(-4) == 'True' result = f(input) console.log(result, check, '['+input+']') }) <!-- end snippet -->