When I was an undergraduate student at METU, I joined the ACM club. We participated in weekly / monthly contests, joined coding boot camps to get better at contest skills, and visited other ACM clubs in Turkey. I was never as good at participating in a global ICPC contest, but I still loved the excitement of solving problems. After graduating with my master’s, I have a longing for those times. Because implementing real-time systems or research ideas makes you write tens of classes, thousands of lines of codes. However, these computation problems are much simpler to implement yet could be very tough to crack. So, here is my six-month journey to start competitive programming again.
1.It started with “Advent of Code”
Due to lockdown, I think 2020’s advent calendars are even more fun to make us forget about Christmas markets in the town. I got a tea advent, one for chocolate, and I started Advent of Code. Sadly, the time difference made me join the party a little late for the daily scoreboard, but it was a pleasure solving problems with the Redditt community. My AoC Github repo
2.Leetcode and Hackerrank
Solving all the advent of code problems daily, I developed a daily habit and ready for my new year resolution of solving one Leetcode problem in January. Naturally, I thought starting with #1 and going all the way to #1885 in Leetcode was a solid idea. How wrong I was! I do not understand what the intuition with the LC ordering system is. One problem was super easy, and the next one was hardcore. I felt like I am not learning gradually. Then I found this list of LC problems by patterns, and everything made much sense. I also like the Hackerrank has micro curriculums for the specific issues you want to tackle that day. In February, as the shortest month of the year, I had enough courage to take the LC monthly challenge. I find it also nice to solve one random question every day, but it can be surprisingly difficult for some days.
3.Google Coding Competitions
Google offers three worldwide competitions. Google Kickstart is the coding challenge throughout the year, and difficulty changes each round. Google Code Jam is the well-known one. Participants solve challenging, algorithmic puzzles against time. This also has a round system throughout the year, and there are monetary rewards for those survivors! I joined Google Hash Code this year with my team. The problem style is not like small puzzles; there is one big engineering problem (most probably NP) with different test cases given a couple of hours to tackle it. This year there were virtual hubs, and teams could code together with Zoom. Following the Twitter hashtag that night, I felt we were a global team together. Although our team could only make it to the first #1000, we will definitely be more prepared next year. Google Coding platform has a perfect archive to prepare for these challenges, and I recommend looking at the previous year’s problem before jumping into Hashcode.
Then there is an old classic USACO. This is the official training platform for USA Programming Competitions. Please do not fall for their retro website; the training documentation is top-notch, and each topic tackles one specific skill for the coding competitions. Their file reading/writing system can be a bit annoying, though! After completing some of the training set problems, I hit one level as I could no longer tackle problems even I spent a week! Then, I decided to level back a bit and cover the basics one more.
5.Books and Videos
I used C++ for most of my projects. For a difference, I start practicing problems in Python as well. Unfortunately, I forgot some data structures (because I never used them in research). This video from FreecodeCamp comes to survive. It is 8-hour long and not something you can digest in one day, but it gives a good refresher, even examples in code. For those who want to study algorithms, “Elements of Programming Interviews in Python by Aziz, Lee, Prakash “ is the best one I read. It gives a good explanation of the problems and offers variations in interviews and coding challenges. The beginning of the book provides a helpful table for which problems to focus on in a limited time frame. If you are preparing for interviews, time is always against you! I find this repo extremely convenient to find Leetcode equivalents easily to EPI problems, and it (mostly) follows the table at the beginning of the book. There are some topics that I need to spend more time to understand and think about; for instance, dynamic programming was never a good friend of mine. I can recommend the playlist from Errichto for understanding the nature of DP problems. His whole channel is always helpful for those who want to checkout.
I am taking some vacation for the summer. But I developed solving one LC problem a day and I gain self esteem a well. I never thought I am ready for coding interviews or white board style coding problems until this day. Even in grad school, you have to tackle at least some coding interviews for internships and research engineer roles so no way to escape from it. There is a quote that motivates me a lot:
“Solving Leetcode everyday, keeps the interview fear away!”