July 31, 2011
Years ago I played a couple of different games with letters, rather than numbers, on dice – attempting to form words from the letters displayed on top of the dice. I was not very good with those games, and I recall attempting to create a computer program to help me with the challenge. The screaming fast 1 MHz CPU and 64KB of memory proved to be no match for the words listed in the paper-bound dictionary sitting on the shelf. Computers are significantly faster now, with wide-spread access to Internet based word lists, so it probably would not be much of a challenge today to build a solution for one of those dice letter games.
Finding different combinations with number digits is a bit easier than working with letters – we are able to use math rules to determine if the specified conditions are met rather than a dictionary. We will start with an easy problem that I found on the web, but I will keep the source of that problem a secret for now. Consider the number 989,901. If we write the digits in that number from right to left, we obtain the new number 109,989. What is special about that new number? The number is evenly divisible by 3 and 9, but more interesting is that the new number divides evenly into the original number (989,901).
With the help of Oracle Database, find all of the numbers from 1 to 1,000,000 where the digits in the number when listed from left to right are evenly divisible by those same digits listed from right to left. The numbers that end with 0 are a special case, reversing the order of the digits in those numbers will result in the 0 digit effectively disappearing – as such, exclude any number that ends with 0 from being tested.
There are several methods to swap the order of the digits in the number. Would you use a different method to test all of the numbers between 1 and 10,000, or to test all of the numbers up to 10,000,000?
Might it work to store the numbers in a reverse key index, and then dump the resulting index values – is that the fourth method to switch the order of the digits? ;-)