Entries to my programming challenge
Calvin submitted the first entry to my programming challenge. And (surprise!), it’s in Visual Fox Pro. I didn’t know Fox Pro can do that! It’s always nice to see unconventional ways to solve a problem.
Calvin’s post includes the source code, comments, and some anecdotes. I suggest you check it out.
After studying the code and comments, my conclusion is that his algorithm is a brute-force one. In summary, it:
- generates all possible ways to represent the phone number using a sequence of English letters (not necessarily words) and decimal digits, (e.g. “23hj6p8x” is a way to represent “23456789” )
- for each sequence from step 1, generates all possible ways to divide it into sections (by inserting dashes into the sequence, e.g. “23h-j-6p8-x” ), and
- filters out the entries from step 2 that contains illegitimate words (thus “23h-j-6p8-x” is out since “23h” is not a valid word).
This idea is a sound one, i.e. it does give all the result we want. However, I wish it could be more efficient, although efficiency is not the main concern for this competition. (Calvin mentioned he also has an optimized version but didn’t post that one.)
Now let’s come to the clarity. The code is about 100 lines of Fox Pro. I managed to understand it with the comments, even though I never programmed in Fox Pro before (You should be able to translate this code into any other procedural language like C++ or VB with little trouble). The EnumNum()procedure is still a little too big to my taste, and could benefit from refactoring.
You cannot talk about the clarity of the code without talking about the clarity of the algorithm and data structure. I saw many programmers trying hard to improve their code, while what needs to be improved is the algorithm. The leap from optimization-in-the-small to optimization-in-the-large can often make surprising difference.
For this contest, I believe there are algorithms that are both simpler and more efficient. Let’s work harder!
After writing the above, I got another entry by Justin Rogers. This one is about 140 lines of C# , and has basically no comments. In Justin’s own words:
“I made some changes to the algorithm by cutting out single character responses. I don't bother placing the dashes in since I don't think they are uber important, but I could put that feature back in if necessary.
I'm using the cheapo dictionary for now, and I've done 0 optimizations. The only true optimization is in the switch table.
One thing to note. You can really optimize the algorithm in the case that a 1 or 2 somehow bisects the numbers. When you do this, you only have to process two substrings, reinserting the splitting character where necessary. This can result in a huge performance gain. However, a good deal of the numbers you would process don't contain a 1 or a 0, and so the perf gain is lost.
And my algorithm isn't properly convergent either, so I'm not yet completed.”
Justin, I don’t know what you mean by “isn’t properly convergent”. Literally I think that means the program does not terminate (oh, BTW, in this case you don’t really have an algorithm. An algorithm by definition must terminate.). I’m sure you can fix that though.
I also spotted some suspicious lines that could a bug. Nice try. But please make sure you code runs when submitting. Some sample results can help convince us (and yourself) of that.
The competition is getting more interesting. Who’ll be the next?
<4/1/04, 4pm: edited to add Justin’s entry>
Comments
- Anonymous
April 06, 2004
I got you. I've updated mine. Properly convergent meant that it only showed a subset of results. It both compiled and ran as it was. The new version is ever so slightly more complete. I wish I'd had more time to get this done earlier, but other matters came to take my time. Latest sample results from the sample dictionary for the given number.
C:ProjectsCSharpSamplesNum2Words>Num2Words dictionary.txt 6423946369
nice9infox
6ice9godo9
64bewhofox
6423wine69
6icewinfox
64be94of69
64bewhodo9
6423window
6icewindo9
6423win369
6ice9in369
64be946369
64be9infox
64bewin369
6ice94of69
nicewhodo9
6icewhofox
nicewho369
nice946369
64239infox
64239indo9
6ice9indo9
64bewho369
6423946369
64bewind69
64239godo9
64be9in369
6icewin369
nicewine69
64239in369
64bewinfox
64bewindo9
64bewine69
nicewindo9
6icewine69
6423whodo9
nicewind69
6ice9infox
nice9indo9
nicewindow
64239gofox
6423whofox
6ice9go369
6423windo9
64be9go369
6icewhodo9
6ice946369
64be946fox
nice9gofox
nice94of69
6ice946fox
6icewho369
64239go369
6423946fox
6423winfox
nice946do9
642394of69
6423who369
6icewind69
6ice9gofox
6ice946do9
nicewinfox
6icewindow
nice9godo9
nice9go369
64be9godo9
64be9gofox
64bewindow
nice9in369
nicewhofox
6423wind69
64be946do9
6423946do9
64be9indo9
nicewin369
nice946fox