The problem, though, was that we didn't estimate properly the time it would take each of us to work out the problem. I don't know how much work my teammates were putting into it, but I put in about an hour or two every day that week. I guess (I hope) they were doing the same. I estimated my programming ability pretty well (which is unusual for me), and got it done just in time - I then volunteered to do the extra work of putting the three parts together at the end, because we needed someone to, and I might as well. All this time, I assumed that my teammates were working at about the same pace as me, and making about as much progress. This was a mistake.
On friday, when the sent me their code, so that I could combine it with mine and submit it, it turned out that they, together, had about 50 lines of code to my 200, and were asking me to finish doing the majority of what they were supposed to have done - the abstraction of figuring out window locations and comparing them. There was no way I could have done this, together with adding a user interface as I had volunteered to do, before midnight, so I figured it was best not to submit at all - this was wrong.
The main thing I learned from our problem here is that equal distribution of labor is not the best way to go about things. Instead, I should have made sure that my teammates were not being given more than they could handle. Of course, I could not have done much more than I did in a week, so perhaps it was impossible for us to do it. Still, I should have given myself much more work than I gave them, rather than distributing it equally. Still, though, they did say they'd be able to handle it, so I also learned to always report my ability correctly in planning - and to make sure others do the same.