The reason the game is evil is because the game never picks a word, but every time the user guesses a letter it finds the largest subset of the current words that satisfies the guesses and makes that the new list of current words. For example if there are only the following six words and the user guesses 'e' the program will divide the words into the following three answer groups and then pick _ee_ because it is the largest group. This continues until the users is out of guesses or the group size is 1 in which case the user has won.
_ee_ : beer been teen
__e_ : then area
____ : rats
For a long time most of my projects were coded in C++ using STL (or similar libraries) for my collections. I had a growing sense of unhappiness with how I was writing code. Between for loops sprinkled everywhere, the way that the STL doesn't include convenience functions such as append() my code might be familiar to another STL developer, but the intent of the code was always harder to determine. As I played around with Clojure I understood the value of map/filter/reduce, but didn't make the connection to how I could use it in C++. It wasn't until I started working on a project that was written in C# and learned about LINQ did it all come together. So many of the for loops I had written in the past were doing a map/filter/reduce operation, but in many lines compared to the one or two lines of C#.
Using chaining and map it is clear that the second solution does three things, splinting the paragraph into words, doing something with each word, and combines them back together. A user doesn't need to understand how each word is being manipulated to understand what the function is doing. The first solution is more difficult to reason about, leaks variables outside of the for loop scope and much easier to have a bug in. Even if you only think of map, filter, and reduce as specialized for loops it increases a developers vocabulary and by seeing a filter() you instantly know what the code will be doing where with a for loop you must parse the entire thing to be sure. Using these functions remove a whole class of issues where the intent is easily hidden with a for loop that goes from 0 - n, 1 - n or n - 0 rather than the common case of 0 - (n-1) not to mention bugs stemming from the same variables used in multiple loops.