Good fun, I&#x27;m going to hope that using ipython still qualifies, and it made things much easier by letting you define functions that join some ad-hoc datasets to look for matches, or read particular files.<p>A similar approach to different puzzles by Peter Norvig[1]<p>Other useful (and perhaps less common) utilities I used were &#x27;q&#x27;[2], and the standard unix &#x27;comm(1)&#x27;[3]<p>[1] <a href="http:&#x2F;&#x2F;nbviewer.jupyter.org&#x2F;url&#x2F;norvig.com&#x2F;ipython&#x2F;Fred%20Buns.ipynb" rel="nofollow">http:&#x2F;&#x2F;nbviewer.jupyter.org&#x2F;url&#x2F;norvig.com&#x2F;ipython&#x2F;Fred%20Bu...</a><p><a href="http:&#x2F;&#x2F;norvig.com&#x2F;sudoku.html" rel="nofollow">http:&#x2F;&#x2F;norvig.com&#x2F;sudoku.html</a><p>[2] <a href="https:&#x2F;&#x2F;harelba.github.io&#x2F;q&#x2F;" rel="nofollow">https:&#x2F;&#x2F;harelba.github.io&#x2F;q&#x2F;</a> - sqlite text munging ended up being a bit too clunky though, and I couldn&#x27;t remember&#x2F;fix the join syntax to make it worthwhile in teh end.<p>[3] $ comm -12 &lt;(sort memberships&#x2F;AAA) &lt;(sort memberships&#x2F;Delta_SkyMiles) &gt; aaa_delta_comm # intersect names in 2 files. Sadly can&#x27;t handle more than 2 inputs directly though, and assumes pre-sorting.