Ruby正确的Euler 8嵌套循环代码



在具有最大产品的1000位数字中找到13个相邻数字。该产品的价值是多少?https://projecteuler.net/problem = 8

data = '''73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450'''

代码是:

def largest_product_series
  mx = 0
  arr = data.split("")
  arr.map!{ |x| x.to_i}
  (arr.size - 13).times do |i|
    0.upto(13) do |c|
        result = arr.inject() {|sum,c | sum * arr[i + c]}
        puts result
        if result >= mx
            mx = result 
        end 
    end 
  end 
  #puts "#{mx}"
  mx
end

实际上是我正在研究的Euler Project 8。请帮助我纠正我的代码并给我一些建议,我不断获得一百位数字的输出。

一种红宝石的做法如下。

data = '73167176531330624919225119674426574742355349194934' +
       '96983520312774506326239578318016984801869478851843' +
       '85861560789112949495459501737958331952853208805511' +
       '12540698747158523863050715693290963295227443043557' +
       '66896648950445244523161731856403098711121722383113' +
       '62229893423380308135336276614282806444486645238749' +
       '30358907296290491560440772390713810515859307960866' +
       '70172427121883998797908792274921901699720888093776' +
       '65727333001053367881220235421809751254540594752243' +
       '52584907711670556013604839586446706324415722155397' +
       '53697817977846174064955149290862569321978468622482' +
       '83972241375657056057490261407972968652414535100474' +
       '82166370484403199890008895243450658541227588666881' +
       '16427171479924442928230863465674813919123162824586' +
       '17866458359124566529476545682848912883142607690042' +
       '24219022671055626321111109370544217506941658960408' +
       '07198403850962455444362981230987879927244284909188' +
       '84580156166097919133875499200524063689912560717606' +
       '05886116467109405077541002256983155200055935729725' +
       '71636269561882670428252483600823257530420752963450'
     def prod(arr)
       arr.reduce(1, :*)
     end        
     arr = data.each_char.map(&:to_i).each_cons(13).max_by { |a| prod(a) }
       #=> [5, 5, 7, 6, 6, 8, 9, 6, 6, 4, 8, 9, 5]
     [arr.join, prod(arr)]
       #=> ["5576689664895", 23514624000] 

步骤如下。假设

data = '731671765313326'

data.size #=> 15)。然后

b = data.each_char.map(&:to_i)
  #=> [7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2, 6] 
c = b.each_cons(13)
  #=> #<Enumerator: [7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2, 6]:each_cons(13)>

我们可以通过将其转换为数组来看到该枚举者将生成的元素:

c.to_a
  #=> [[7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3],
  #    [3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2],
  #    [1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2, 6]] 
arr = c.max_by { |a| prod(a) }
  #=> [7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3]

这是通过计算获得的:

[prod [7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3],
 prod [3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2],
 prod [1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2, 6]].max
  #=> [5_000_940, 1_428_840, 2_857_680].max
  #=> 5000940

最后一步是返回数组

[arr.join, prod(arr)]
  #=> [[7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3].join,
  #=>   prod([7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3])]
  #=> ["7316717653133", 5000940]

最新更新