Простая проблема с fizzbuzz

Я выполняю несколько CodeEval задач и выполняю одно fizzbuzz. Теперь я уверен, что это очень простая проблема, и я только что ее рассмотрел, но я делаю это в python, в котором я новичок и только учусь.

Игроки обычно сидят в кругу. Первый игрок говорит цифру «1», и каждый игрок по очереди называет следующую цифру. Однако любое число, делящееся на X (например, три), заменяется словом fizz, а любое число, кратное Y (например, пять), - словом buzz. Числа, кратные обоим, превращаются в шумиху. Если игрок колеблется или допустил ошибку, он выбывает из игры.

Напишите программу, которая распечатывает последнюю серию чисел, в которой числа, делящиеся на X, Y, заменяются на «F» для шипения, «B» для гудения и «FB» для «шипения».

Входной образец:

Ваша программа должна принять файл в качестве первого аргумента. Файл содержит несколько разделенных строк; каждая строка содержит 3 числа, разделенных пробелами. Первое число - это первый разделитель (X), второе число - это второй разделитель (Y), а третье число - это то, как далеко вы должны считать (N). Вы можете предположить, что входной файл отформатирован правильно, а числа являются действительными положительными целыми числами.

Например:

3 5 10

2 7 15

Выходной образец:

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

Распечатайте ряды от 1 до N, заменив числа, делящиеся на X, на «F», числа, делящиеся на Y, на «B», а числа, кратные на оба, на «FB». Поскольку входной файл содержит несколько наборов значений, в вашем выводе должна быть распечатана одна строка для каждого набора. Убедитесь, что в каждой печатаемой строке нет конечных пустых пробелов.

Ограничения:

Количество тестовых случаев ≤ 20

X находится в диапазоне [1, 20]

Y находится в диапазоне [1, 20]

N находится в диапазоне [21, 100]

Когда я запускаю свою программу, я получаю следующий вывод из файла:

1
1

Что я делаю не так, если моя программа неправильно обрабатывает файл?

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))

person Pyth0nicPenguin    schedule 09.11.2016    source источник
comment
Если вы хотите вернуть несколько значений в виде цикла, см. yield ключевое слово и генераторы. После этого вызывающий может либо перебрать полученное значение (for txt in fizzbuzz(nums, low, high)), либо преобразовать его в список (seq = list(fizzbuzz(nums, low, high))), чтобы обработать его позже.   -  person Łukasz Rogalski    schedule 09.11.2016


Ответы (1)


Ваша функция возвращает первое значение x. Вам нужно создать строку ответов внутри цикла, а затем вернуть эту строку только после завершения цикла.

Также обратите внимание, что ваша логика никогда не может вернуть «FB», поскольку это находится в предложениях else как для «F», так и для «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

Поскольку вы возвращаете строку, вам необходимо преобразовать число, прежде чем добавлять его. Я не все починил для вас, но это должно заставить вас двигаться.

person Prune    schedule 09.11.2016