CodeSignal: TennisSet

CodeSignal: TennisSet

·

2 min read

Sometimes the code is cleaner if there is some pre-determination or pre-categorization of possible values. Take this problem:

In tennis, the winner of a set is based on how many games each player wins. The first player to win 6 games is declared the winner unless their opponent had already won 5 games, in which case the set continues until one of the players has won 7 games.

Given two integers score1 and score2, your task is to determine if it is possible for a tennis set to be finished with a final score of score1 : score2.

Example

For score1 = 3 and score2 = 6, the output should be
tennisSet(score1, score2) = true.

Since player 1 hadn't reached 5 wins, the set ends once player 2 has won 6 games.

For score1 = 8 and score2 = 5, the output should be
tennisSet(score1, score2) = false.

Since both players won at least 5 games, the set would've ended once one of them won the 7th one.

For score1 = 6 and score2 = 5, the output should be
tennisSet(score1, score2) = false.

This set will continue until one of these players wins their 7th game, so this can't be the final score.
def tennisSet_initial(score1, score2):
    if score1 < 5 or score2 < 5:
        return(score1 == 6 or score2 == 6)

    if score1 == 5 or score2 == 5:
        if score1 == 6 or score2 == 6:
            return False
        if score1 == 7 or score2 == 7:
            return True
        return False

    if score1 == 7 and score2 == 7:
        return False

    if score1 == 7 or score2 == 7:
        return score1 >= 5 or score2 >= 5
    return False

Compared to:

def tennisSet_2(score1, score2):
    a = min(score1, score2)
    b = max(score1, score2)
    if b == 6:
        return a < 5
    return b == 7 and a >= 5 and a < b

Or

def tennisSet_3(score1, score2):
    return sorted((score1, score2)) in ([6, 7], [5, 7], [4, 6], [3, 6], [2, 6], [1, 6], [0, 6])