Search code examples
pythonpython-2.7fizzbuzz

Simple fizzbuzz issue


I'm doing some CodeEval challenges and am doing the fizzbuzz one. Now im sure this is a very simple problem and I'm just over looking it, but I'm doing this in python which I'm fairly new to and just learning.

Players generally sit in a circle. The first player says the number “1”, and each player says next number in turn. However, any number divisible by X (for example, three) is replaced by the word fizz, and any divisible by Y (for example, five) by the word buzz. Numbers divisible by both become fizz buzz. A player who hesitates, or makes a mistake is eliminated from the game.

Write a program that prints out the final series of numbers where those divisible by X, Y and both are replaced by “F” for fizz, “B” for buzz and “FB” for fizz buzz.

Input sample:

Your program should accept a file as its first argument. The file contains multiple separated lines; each line contains 3 numbers that are space delimited. The first number is the first divider (X), the second number is the second divider (Y), and the third number is how far you should count (N). You may assume that the input file is formatted correctly and the numbers are valid positive integers.

For example:

3 5 10

2 7 15

Output sample:

1 2 F 4 B F 7 8 F B

1 F 3 F 5 F B F 9 F 11 F 13 FB 15

Print out the series 1 through N replacing numbers divisible by X with “F”, numbers divisible by Y with “B” and numbers divisible by both with “FB”. Since the input file contains multiple sets of values, your output should print out one line per set. Ensure that there are no trailing empty spaces in each line you print.

Constraints:

The number of test cases ≤ 20

"X" is in range [1, 20]

"Y" is in range [1, 20]

"N" is in range [21, 100]

When I run my program I get the following output from the file:

1
1

What am I doing wrong to where my program is not running through the file correctly?

def fizzbuzz(num_range, div_low=3, div_high=5):
    for x in num_range:
        if x % div_low == 0:
            return "F"
        elif x % div_high == 0:
            return "B"
        elif x % div_low == 0 and x % div_high == 0:
            return "FB"
        else:
            return x

if __name__ == '__main__':
    with open("numbers.txt", "r") as nums:
        for i in nums.readlines():
            high = int(i.rstrip().split(" ")[1])
            low = int(i.rstrip().split(" ")[0])
            nums = range(1, int(i.rstrip().split(" ")[2]))
            print(fizzbuzz(nums, low, high))

Solution

  • Your function returns on the first value of x. You need to build up a string of responses within the loop, and then return that string only after you complete the loop.

    Also note that your logic can't ever return "FB", since that's in else clauses for both "F" and "B".

    series = ""
    for x in num_range:
        if x % div_low == 0 and x % div_high == 0:
            series += "FB"
        elif x % div_low == 0:
            series += "F"
        elif x % div_high == 0:
            series += "B"
        else:
            series += str(x)
    
    return series
    

    Since you return a string, you have to convert the number before appending it. I haven't fixed everything for you, but this should get you moving.