Nerd For Tech
Published in

Nerd For Tech

“Hacking” a Hackerrank problem using Python Basics.

This is a story about how I leveraged some of the Python’s lesser known capabilities to my advantage in solving a regular expression problem in a rather esoteric way (as we’ll see) on a popular coding platform called Hackerrank.

It’s been 5 years since and I think I can finally come out of the closet and reveal to the world what I did that day.

Year 2016, January. The 7th.

I was in the third year of my Computer Science undergrad when I came across the Regular Expresso challenge on Hackerrank. I found it intriguing that I had to solve a set of 8 regular expression challenges under an hour.
Folks not familiar with regex can read about it here.

I equipped myself with my then favourite programming language, Python to be able to complete the task.

Fast forward 5 questions and I’m blazing through the contest in no time.

First five questions in no time (duh: they were easy)

Enter the 6th question, the Match Maker. This was labelled as Hard.
The full question can be found here.

The Dreaded question #6

The challenge talked about how we had to write a regex that had to match all of these (insert a list of words) and none of these (another list of words). The core constraint was that the length of the regular expression we write cannot exceed 60.

What we had to fill.

This, the platform validated using the below stub which we couldn’t override.

Notice the greyed non editable block.

The Struggle

The challenge to the problem was to first, find the regular expression and then (second) optimize it to a minimum length.

I did find a regex but the length was exceeding 60.

This works but is at 75 characters

After struggling for 30 minutes with the time running out, I thought I’d try to game the system. I knew the Hackerrank stub checks that the length of my input using the len() and discards it if it is greater than 60 right away.

len() is an inbuilt function on the Python module __built__in

If only I could modify the logic that aims to find the length of a string

The Hustle

It hit me that in Python, you can override even the in built functions. This I thought was pure golden and evil while I was reading through its documentation back in the day.

I decided that I will override the len() function to always return a number that is less than or equal to 60. This way, I hoped I’d pass the stub validation as it only checks if the length is greater than 60

def len(string):
""" An evil implementation that is only aimed to pass the test"""
return 60

And I did xD

I pressed submit and then to (not) my surprise all the tests passed.

The Joy of passing all tests :D

How Hackerrank could have avoided this?

Well, for starters, detect overrides of built in functions, maybe?
These would now belong to a different module than __built__in__

An overridden function has a different memory address

The Aftermath

I went on to solve one more problem in the challenge but the joy I experienced in Problem #6 surpassed it all.

The #8th problem for which I’d bought time because of the hack in #6

So, that’s all folks. The takeaway is that Reading documentation helps.
Hope you all enjoyed this piece.

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store