This is very cool. In puzzlehunts, we often use tools to assist with solving and writing puzzles (the classic example is https://nutrimatic.org ).
Years ago, I wrote a puzzlehunt puzzle that involved navigating through words where an edge existed if the two words formed a common 2-gram (that is, they often appeared one after another in a text dump of Wikipedia).
For example, a fragment of the graph from the puzzle is: mit -> press -> office <- post <- blog.
This work is obviously much more advanced, and it's very cool to see that they managed to make it work with semantic connections. I was able to get away with a much simpler approach since I only cared about 2-grams over a set of about 1000 words (I literally used a grep command over the entire text of the English wikipedia; it took about a day to run).
But the core idea is shared: 1) wanting to build a graph representation of word connections for a puzzle, 2) it being way to much work to do that manually, 3) you would miss a bunch of edges if you did do it manually, so 4) use programming tools to construct a dataset, and then 5) the end result is surprisingly fun for the user because the dataset is comprehensive and it feels really natural.
And a fair warning to anyone unfamiliar with puzzlehunt puzzles: they do not come with instructions and it is very common to get stuck when solving them, especially when solving them alone. You have not completely solved a puzzlehunt puzzle until you extract an answer word or phrase from the puzzle. This one has an extra layer after filling in the words in the graph. Peeking at the solution is encouraged if you get stuck.
Print debugging is a great tool in unfamiliar environments. As the article notes, it’s simple and works everywhere.
I do think that it’s worth learning your debugger well for programming environments that you use frequently.
In particular, I think that the debugger is exceptionally important vs print debugging for C++. Part of this is the kinds of C++ programs that exist (large, legacy programs). Part of this is that it is annoying to e.g. print a std::vector, but the debugger will pretty-print it for you.