2016-11-09 210 views
-1

我正在做一些CodeEval的挑戰,我在做fizzbuzz之一。現在我確定這是一個非常簡單的問題,我只是在看它,但我在python這樣做,這是我剛剛學習和剛剛學習。簡單fizzbuzz問題

玩家通常坐在一個圓圈內。第一個玩家說數字「1」,每個玩家依次說下一個數字。然而,任何可被X整除的數字(例如三個)被fizz這個詞代替,並且任何可被Y(例如五個)整除的單詞buzz代替。可以被雙方整除的數字會變成嘶嘶聲。猶豫或者犯錯的玩家將被淘汰。

編寫一個程序,打印出最終的一系列數字,其中可被X,Y和Y均可分解的數字由「F」表示嘶嘶聲,「B」表示嗡嗡聲,「B」表示嘶嘶聲。

輸入樣本:

您的程序應接受一個文件作爲其第一個參數。該文件包含多個分隔的行;每行包含3個以空格分隔的數字。第一個數字是第一個分頻器(X),第二個數字是第二個分頻器(Y),第三個數字是你應該計數多少(N)。您可能會認爲輸入文件格式正確,數字是有效的正整數。

例如:

輸出樣本:

1 2 F 4 BF 7 8 FB

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

打印出系列1到N替換數字「F」可被X整除,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)) 
+0

如果您想在某種循環中「返回」多個值,請參閱yield關鍵字和生成器。之後,調用者可以迭代所產生的值('for txt in fizzbuzz(nums,low,high)')或者將其轉換爲列表('seq = list(fizzbuzz(nums,low,high))'),以便稍後處理。 –

回答

1

你的函數返回的X的第一個值。您需要在循環中建立一串響應,然後在完成循環後返回該字符串

另請注意,您的邏輯不能返回「FB」,因爲這在其他子句中都是「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 

既然你返回一個字符串,你必須在附加它之前轉換數字。我沒有爲你解決所有問題,但這應該讓你感動。

+0

請參閱!我知道這很簡單! – Pyth0nicPenguin