I recently came across a wonderful programming game: Untrusted.
It is not a game you install, you just play it on your web browser. You don't need to buy it, you don't need any in-app currency. It requires some knowledge of programming.
It's a weird game. You edit code to finish a level, and very few instructions are provided. The games require some critical thinking, and some brute-force. Some of the levels are cunning.
Do try it! It is one of the most innovative and brilliant games I have played recently.
Screenshot of the ending. It's the journey, not the destination.