Ruby 中的 Euler 8 项目

Mic*_*wen 1 ruby

我知道我的代码可以得到 4 个相邻整数的正确答案。但它不适用于 13。

我唯一能想到的是它可能是一个 unsigned int 的问题,但在 Ruby 中我不认为我会遇到这个问题,因为它会自动变成一个 Bignum 类。

所以这意味着在我的计算中我错了?

请给我一个提示。

# Euler 8
# http://projecteuler.net/index.php?section=problems&id=8
# Find the thirteen adjacent digits in the 1000-digit number 
# that have the greatest product. 
# What is the value of this product? 


number = []

#split the integer as a string into an array
long_digit = "73167176531330624919225119674426574742355349194934
            96983520312774506326239578318016984801869478851843
            85861560789112949495459501737958331952853208805511
            12540698747158523863050715693290963295227443043557
            66896648950445244523161731856403098711121722383113
            62229893423380308135336276614282806444486645238749
            30358907296290491560440772390713810515859307960866
            70172427121883998797908792274921901699720888093776
            65727333001053367881220235421809751254540594752243
            52584907711670556013604839586446706324415722155397
            53697817977846174064955149290862569321978468622482
            83972241375657056057490261407972968652414535100474
            82166370484403199890008895243450658541227588666881
            16427171479924442928230863465674813919123162824586
            17866458359124566529476545682848912883142607690042
            24219022671055626321111109370544217506941658960408
            07198403850962455444362981230987879927244284909188
            84580156166097919133875499200524063689912560717606
            05886116467109405077541002256983155200055935729725
            71636269561882670428252483600823257530420752963450"

long_digit.split("").map { |s| number << s.to_i }

#iterate through the array to find the 13 ajacent digits that have the largest product
largest_product = 0
a = 0
#stay within the bounds of the array
while number[a+12]
    current_product = number[a] * number[a+1] * number[a+2] * number[a+3] * number[a+4] * number[a+5] * number[a+6] * number[a+7] * number[a+8] * number[a+9] * number[a+10] * number[a+11] * number[a+12] 
        if current_product > largest_product
            largest_product = current_product
        end 
    a = a + 1
end

puts largest_product
Run Code Online (Sandbox Code Playgroud)

Fra*_*air 5

我认为这个解决方案非常干净和简单:

#!/usr/bin/env ruby

input = "
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450"
.gsub(/\s+/, '')

puts input.chars
          .map(&:to_i)
          .each_cons(13)
          .map { |seq| seq.reduce(:*) }
          .max
Run Code Online (Sandbox Code Playgroud)

gsub 执行修剪。

chars 获取字符。

map(&:to_i) 将所有字符映射到整数。

each_cons(13)获取连续数字块(https://ruby-doc.org/core-2.4.1/Enumerable.html#method-i-each_cons

map { |seq| seq.reduce(:*) } 将采用每个连续块并执行归约(将每个切片/连续数字块的所有数字相乘)。

max 得到最大值。