HackerRank Solution: Python Default Arguments [Debugging]


Written by - Bashir Alam
Reviewed by - Deepak Prasad

Question: Python Default Arguments (Debugging)

In this challenge, the task is to debug the existing code to successfully execute all provided test files.

Python supports a useful concept of default argument values. For each keyword argument of a function, we can assign a default value which is going to be used as the value of said argument if the function is called without it. For example, consider the following increment function:

def increment_by(n, increment=1):
    return n + increment

The functions works like this:

>>> increment_by(5, 2)
7
>>> increment_by(4)
5
>>>

Debug the given function print_from_stream using the default value of one of its arguments.

The function has the following signature:

def print_from_stream(n, stream)

This function should print the first n values returned by get_next() method of stream object provided as an argument. Each of these values should be printed in a separate line.

Whenever the function is called without the stream argument, it should use an instance of EvenStream class defined in the code stubs below as the value of stream.
Your function will be tested on several cases by the locked template code.

Input Format:

The input is read by the provided locked code template. In the first line, there is a single integer q denoting the number of queries. Each of the following line q contains a stream_name followed by integer n, and it corresponds to a single test for your function.

Constraints:

1 <= q <= 100
1 <= N <= 10

Output format:

The output is produced by the provided and locked code template. For each of the queries (stream_name, n), if the stream_name is even then print_from_stream(n) is called. Otherwise, if the stream_name is odd, then print_from_stream(n, OddStream()) is called.

Sample Input:

3
odd 2
even 3
odd 5

Sample Output:

1
3
0
2
4
1
3
5
7
9

Explanation:

There are 3 queries in the sample.

  • In the first query, the function print_from_stream(2, OddStream()) is executed, which leads to printing values 1 and 3 in separated lines as the first two non-negative odd numbers.
  • In the second query, the function print_from_stream(3) is executed, which leads to printing values 2, 4 and 6 in separated lines as the first three non-negative even numbers.
  • In the third query, the function print_from_stream(5, OddStream()) is executed, which leads to printing values 1, 3, 5, 7 and 9 in separated lines as the first five non-negative odd numbers.

 

Possible solutions

Now we will go through various solutions to solve the above given HackerRank problem. We have been provided with the following function and class:

class EvenStream(object):
    def __init__(self):
        self.current = 0

    def get_next(self):
        to_return = self.current
        self.current += 2
        return to_return

class OddStream(object):
    def __init__(self):
        self.current = 1

    def get_next(self):
        to_return = self.current
        self.current += 2
        return to_return

def print_from_stream(n, stream=EvenStream()):
    for _ in range(n):
        print(stream.get_next())


queries = int(input())
for _ in range(queries):
    stream_name, n = input().split()
    n = int(n)
    if stream_name == "even":
        print_from_stream(n)
    else:
        print_from_stream(n, OddStream())

Here we will go through two different solutions

 

Solution-1:

Let us solve the problem using the first and simple method:

class EvenStream(object):
    def __init__(self):
        self.current = 0

    def get_next(self):
        to_return = self.current
        self.current += 2
        return to_return

class OddStream(object):
    def __init__(self):
        self.current = 1

    def get_next(self):
        to_return = self.current
        self.current += 2
        return to_return

def print_from_stream(n, stream=None):
    if stream is None:
        stream = EvenStream()
    for _ in range(n):
        print(stream.get_next())

raw_input = input

queries = int(input())
for _ in range(queries):
    stream_name, n = input().split()
    n = int(n)
    if stream_name == "even":
        print_from_stream(n)
    else:
        print_from_stream(n, OddStream())

This code defines two classes, EvenStream and OddStream, which are both streams that generate a sequence of numbers. The EvenStream generates a sequence of even numbers starting at 0, while the OddStream generates a sequence of odd numbers starting at 1. The print_from_stream function takes an integer n and an optional stream object and prints the next n numbers from the stream. If no stream is provided, it defaults to an EvenStream.

The code then reads an integer from standard input, indicating the number of queries to follow. For each query, it reads a string indicating which stream to use (either "even" or "odd") and an integer n and then calls the print_from_stream function with the appropriate stream and n.

 

Solution-2:

This solution is also similar to the first one except for the changes in the print_from_stream function:

class EvenStream(object):
    def __init__(self):
        self.current = 0

    def get_next(self):
        to_return = self.current
        self.current += 2
        return to_return

class OddStream(object):
    def __init__(self):
        self.current = 1

    def get_next(self):
        to_return = self.current
        self.current += 2
        return to_return

def print_from_stream(n, stream=EvenStream):
    if callable(stream):
        stream = stream()
    for _ in range(n):
        print(stream.get_next())


queries = int(input())
for _ in range(queries):
    stream_name, n = input().split()
    n = int(n)
    if stream_name == "even":
        print_from_stream(n)
    else:
        print_from_stream(n, OddStream())

he print_from_stream function takes a default argument of EvenStream rather than an instance of EvenStream. This means that if no stream is provided, the function will use the EvenStream class to create a new stream object, rather than using a pre-existing instance of EvenStream. The print_from_stream function includes an additional check to see if the stream argument is callable (i.e., if it is a class). If it is callable, it creates a new instance of the class as the stream object. This allows the function to accept either a stream object or a stream class as the argument.

 

Summary

In this short article, we learned how can solve the Default Argument question from the HackerRank website. We solved the problem using two different solutions.

 

Further Reading

Question of HackerRank: Python Default Arguments (Debugging)

 

Bashir Alam

He is a Computer Science graduate from the University of Central Asia, currently employed as a full-time Machine Learning Engineer at uExel. His expertise lies in OCR, text extraction, data preprocessing, and predictive models. You can reach out to him on his Linkedin or check his projects on GitHub page.

Can't find what you're searching for? Let us assist you.

Enter your query below, and we'll provide instant results tailored to your needs.

If my articles on GoLinuxCloud has helped you, kindly consider buying me a coffee as a token of appreciation.

Buy GoLinuxCloud a Coffee

For any other feedbacks or questions you can send mail to admin@golinuxcloud.com

Thank You for your support!!

Leave a Comment