This weekend, I wound up visiting a restaurant with an irritating trivia question on their welcoming chalkboard: “How many numbers between 0 and 200 contain the number ‘1’ in them?” (e.g. 1, 10, 11, etc.) Puzzles like this tend to stick in my craw, so I tucked it away in my “stuff to figure out later when I have more time” stack.
Since I don’t know a mathematical algorithm to generate a sequence of numbers that contain the number 1 in them, the only way I see to solve this puzzle is “brute force.” Although we can do this manually on a piece of paper fairly quickly (i.e. write the numbers 0 through 200, circle the ones that have a one in them, and then count the circled numbers), that approach is a manual process and can’t be easily reused with different parameters. It also doesn’t scale well if the range of numbers to be checked grows significantly (e.g. between 0 and 10,000).
. . . . <script type="text/javascript"> function howManyXinYthruZ(x, startY, endZ) { counter = 0; // initialize a counter // iterate from first number to last for (a = startY; a <= endZ; a++) { // convert number to string . . . aString = a.toString(); // so we can search for X if (aString.search(x) != -1) { // if we find one, ding the counter counter++; // purely optional, for "proof" console.log(a); } } // share the final tally of matches console.log("count: " + counter); } // invoke the function to solve the puzzle howManyXinYthruZ( 1, 0, 200); </script> . . . .
If you run this little script in a blank page in your browser and then crack open the console, you’ll see a list of all the numbers that match the specified the criteria as well as the final total of matches (i.e. 119).
The nice part of this is that if I ever encounter another trivia question similar to this one (i.e. “How many numbers between 3000 and 5000 have the number 3 in them?”), I can quickly and easily solve it with one function call:
howManyXinYthruZ( 3, 3000, 5000);
// 1,271 in case you’re curious
Not bad, JavaScript. Not bad.