Brian Bi

Contest programming

I occasionally compete in TopCoder and Codeforces. I've solved a lot of problems on SPOJ (profile), and almost all of my SPOJ solutions can be found on GitHub here. I hope you don't copy my solutions and submit them as your own (although technically it is legal to do so since there's nothing in the license that forbids it), because the only person you'll be cheating is yourself. On the other hand, feel free to look at them if you're stuck on a particular problem.

If you're an ACM-ICPC contestant, and you don't have a team notebook (reference material of 25 printed pages or less, to bring with you to the competition floor) then you should consider creating one! It can occasionally be extremely useful, such as during the 2013 University of Chicago Invitational, where my team (University of Toronto) took first place. Carnegie Mellon University would certainly have beaten us, but for the fact that they were unable to implement the simplex algorithm, while we had a pre-written version in our notebook. An ACM-ICPC reference notebook similar to the one I used as a contestant can be found on my GitHub, here. I encourage you to take a look to get an idea of what sort of things would be useful to include when preparing your own team notebook (and what algorithms and techniques you might have missed, if you already have one.) You can even copy this notebook in part or in whole.

I run the PEG Judge. I'm clearly biased, but I believe the PEG Judge is probably the best online judge to use if you're new to competitive programming, because it has a large number of problems that are really easy, as well as IOI-level problems and everything in between! It also supports many languages (not as many as SPOJ, though) and has analyses for many problems. The history of the PEG Judge is documented on the PEG Wiki, here. The PEG Wiki is a companion site to the PEG Judge. It is used for hosting expository articles about computer science (with a focus on competitive programming techniques) as well as for documenting the PEG Judge. I encourage you to contribute, as I clearly have neither the free time nor the expertise to write an entire wiki by myself.

Other projects

My GitHub profile is located here.

In 2011 I was an intern at Facebook, Inc. and spent a lot of time procrastinating on the internal IRC network. I enjoy playing the game Mafia, so I decided to look for an IRC bot that could moderate Mafia games over IRC. Unfortunately, none of the ones I found actually worked, so I decided to develop my own. I named it Kevinbot, and you can find the code here. My original plan was that it would be easily extensible, just by deriving from some sort of Character class and overriding the behaviour in order to create new roles. Unfortunately, the summer ended before I was able to finish developing it in all its glory. Nevertheless, the current version on GitHub is fully functional; documentation (including an explanation of the name) can be found on the wiki attached to the GitHub repo.

The other project you'll notice is a little program called ttycat. I don't think it has any practical application; its purpose is to illustrate the Unix terminal device API and facilitate experimenting with various terminal attributes. It makes more sense if you read my seven-part introduction to terminal devices, starting here. (I wrote this just as much for myself as for anyone else; the official sources of documentation can sometimes be a bit ambiguous, so I worked out a lot of details myself and wrote them down so I could refer to them later.)