https://perl.pythonprogramminghelp.com/getting-smart-with-diagonalization/