It could be made more functional by avoiding the mutation of `acc`. The effects are contained within `judgeCircle` so it's not a big deal, but it feels like if you're going to mutate the accumulator, you might as well just use an imperative loop. I also preferred to be explicit about the final check. I find the intent of `!h && !v` isn't quite as clear as `h == 0 && v == 0;`. I ended up with: const judgeCircle3 = moves => { const [hori, vert] = [...moves].reduce(([h, v], move) => { switch(move) { case "U": return [h, v + 1]; case "D": return [h, v - 1]; case "R": return [h + 1, v]; case "L": return [h - 1, v]; } }, [0, 0]); return hori == 0 && vert == 0; }; I also got rid of the `default` since it didn't seem to be doing anything. You could have done error handling in there (and should in most cases), but if it's a challenge with predefined input, that's probably not necessary unless it's part of the challenge.