Search code examples
pythonset

Check Strict Superset[Hackerrank problem]


So I've been solving hackerrank problems, and I have encountered a pretty strange problem that's been bugging me for hours now. Kindly refer to the problem question here: Strict Superset Hackerrank Problem

Below is my code for this:

import sys
s = set(map(int, input().split()))
inp = int(input())
res = True 

while(inp):
    a = set(map(int, input().split()))
    if len(s) < len(a):
        res = False
        print(res)
        sys.exit()
    if len(s) > len(a):
        res = s.issuperset(a)
    
    inp -= 1
print(res)

When I typed this on hackerrank, it works for all the cases except for the last test case. Upon observation, I came to a conclusion that my code "might not" work for cases where the last comparison returns True, regardless of the comparisons before. I tried updating my code(The one I posted is the updated one), by trying to exit as soon as I find the first instance of False, but to no avail. Here is the Link for the Input, for the last Test case that I've been facing a problem with

So Basically, this is supposed to exit on the first instance of False, but it seems to be not. Kindly help me out. Many thanks!


Solution

  • There were two gaps in this program: first, there is a potential unhandled edge case where the two sets could be equal length. This can be adjusted in your first conditional by making it <= instead of just <.

    Additionally, when you set res = s.issuperset(a), you also need to break when res is False, because in the next iteration, the result may be overridden to True again, which you don't want.

    s = set(map(int, input().split()))
    inp = int(input())
    res = True 
    
    while(inp):
        a = set(map(int, input().split()))
        if len(s) <= len(a):
            res = False
            print(res)
            sys.exit()
        if len(s) > len(a):
            res = s.issuperset(a)
            if not res:
                break
        
        inp -= 1
    print(res)
    

    On a totally unrelated note, I couldn't help myself, and minified the solution to this problem as much as I reasonably could. This is also a valid solution to the challenge:

    superset = set(map(int, input().split()))
    print(all(map(
        lambda subset: len(superset) > len(subset) and superset.issuperset(subset), 
        [set(map(int, input().split())) for _ in range(int(input()))]
    )))