2015-11-13 46 views
0

我已經盯住了我的代碼超過一個小時了,每次都要反覆檢查每個方法。但是,這個非常錯誤的代碼看起來是正確的,我不知道哪個部分有錯誤。任何洞見你們可以給予不勝感激。Ruby中的項目Euler#17,我的(錯誤的)答案對我來說是合乎邏輯的

問題:

如果1至5中的話寫出的數字:一個,兩個,三個,四個,五個,則有3 + 3 + 5 + 4 + 4 = 19個總的字母。

如果所有從1到1000(單萬)的數字包容性話寫出來,多少個字母,會使用嗎?

@ones = [3, 3, 5, 4, 4, 3, 5, 5, 4] 
@teens = [6, 6, 8, 8, 7, 7, 9, 9, 8] #without "ten" 
@tens = [6, 6, 6, 5, 5, 7, 6, 6] #also without "ten" 
@hundred = 7 
@hundred_and = 10 
@one_thousand = 11 

def sum_array(array) 
    array.inject { |sum, n| sum + n } 
end 

def one_to_nineteen 
    sum_array(@ones) + sum_array(@teens) + 3 #ten 
end 

def sum_tens 
    sum = 0 
    @tens.each { |x| sum += sum_array(@ones) + (x * 10) } #0-9 
    return sum 
end 

def one_to_ninety_nine 
    return one_to_nineteen + sum_tens 
end 

def sum_hundreds 
    sum = 0 
    @ones.each do |x| 
    sum += (x + @hundred) + ((x + @hundred_and) * one_to_ninety_nine) + one_to_ninety_nine 
    end 
    return sum 
end 

def one_to_one_thousand 
    print one_to_ninety_nine + sum_hundreds + @one_thousand 
end 

one_to_one_thousand 

這輸出:117750,(在網上查找答案後)是完全錯誤的。

+0

作爲參考,什麼是所期望的輸出?你(用你的方法)爲數字1-10寫了一個程序並測試了它嗎?並移動到1-100,然後1-1000等可能幫助。 –

+0

我只是試圖做到這一點,我也搞砸了,雖然我得到了15752 ... – Charles

+0

所需的輸出是:21124 而我測試了1-10的方法。 –

回答

3

第一個問題是@teens是錯的。你是如何計算的?

對此進行編碼使得難以製作這樣的單據。

@teens = 'eleven twelve thirteen fourteen fifteen sixteen 
      seventeen eighteen nineteen'.split.map(&:size) 

的第二個問題是,@tens也是錯誤的,所以改用

@tens = 'twenty thirty forty fifty sixty seventy eighty ninety'.split.map(&:size) 

現在你應該找到one_to_ninety_nine回報854這是正確的。

第三問題是

sum += (x + @hundred) + ((x + @hundred_and) * one_to_ninety_nine) + one_to_ninety_nine 

應該

sum += (x + @hundred) + ((x + @hundred_and) * 99) + one_to_ninety_nine 
0

我會先建立如下的哈希:

words = 
    { ones: [(1..9).to_a, 
       %w| one two three four five six seven eight nine |], 
     teens: [(0..9).to_a, 
       %w| ten eleven twelve thirteen fourteen fifteen | + 
       %w| sixteen seventeen eighteen nineteen |], 
     tens: [(2..9).to_a, 
       %w| twenty thirty forty fifty sixty seventy eighty ninety |] 
    } 
    #=> {:ones =>[[1, 2, 3, 4, 5, 6, 7, 8, 9], 
    #    ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]], 
    # :teens=>[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    #    ["ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", 
    #    "sixteen", "seventeen", "eighteen", "nineteen"]], 
    # :tens =>[[2, 3, 4, 5, 6, 7, 8, 9], 
    #    ["twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]]} 

接下來我會轉換words到哈希counts那具有相同的密鑰,但具有密鑰相等的哈希值可能的數字值和值等於相應的字的大小:

counts = words.each_with_object({}) { |(k,(nbrs, vals)),h| 
    h[k] = Hash[nbrs.zip(vals.map(&:size))] } 
counts[:ones][0] = 0 
counts 
    #=> {:ones =>{1=>3, 2=>3, 3=>5, 4=>4, 5=>4, 6=>3, 7=>5, 8=>5, 9=>4, 0=>0}, 
    # :teens=>{0=>3, 1=>6, 2=>6, 3=>8, 4=>8, 5=>7, 6=>7, 7=>9, 8=>8, 9=>8}, 
    # :tens =>{2=>6, 3=>6, 4=>5, 5=>5, 6=>5, 7=>7, 8=>6, 9=>6}} 

我們現在可以總結字大小爲11000之間的每個數:

HUNDRED = "hundred".size 
    #=> 7 
AND  = "and".size 
    #=> 3 

(1..999).reduce("onethousand".size) do |tot, i| 
    hun, rest = i.divmod(100) 
    ten, one = rest.divmod(10) 
    hun_count = 
    case hun 
    when 0 then 0 
    else counts[:ones][hun] + HUNDRED + ((i % 100 == 0) ? 0 : AND) 
    end  
    ten_count = 
    case ten 
    when 0 
    counts[:ones][one] 
    when 1 
    counts[:teens][one] 
    else 
    counts[:tens][ten] + counts[:ones][one] 
    end 
    tot + hun_count + ten_count 
end 
    #=> 21124 
相關問題