如何使用Ruby找到数组或字符串中每第三个数字的乘积?

Jam*_*aal 1 ruby arrays string

这只是我想到的一个随机场景,如果我有这个数组:

[3,2,5,6,7,8,9,1,2]
Run Code Online (Sandbox Code Playgroud)

而这个字符串:

'325678912'
Run Code Online (Sandbox Code Playgroud)

我会使用Ruby编写哪些代码来生成:

3*2*5 = 30, 6*7*8 = 336, and 9*1*2 = 18 
Run Code Online (Sandbox Code Playgroud)

并将其放入以下数组:

[30,336,18]
Run Code Online (Sandbox Code Playgroud)

对不起,我忘了把我的代码放回错误的答案:

b = [3,2,5,6,7,8,9,1,2]


first = 0
third = first + 2
array = []
while first<b.length
  prod=1
  b[first..third].each do |x|
    prod*=x.to_i
    array<<prod
  end
  first+=2
  third = first + 2
end

print array
Run Code Online (Sandbox Code Playgroud)

我的另一段代码是:

a = '325678912'

number = a.split('')
first = 0
third = first + 2
array = []
while first<number.length
  prod=1
  number[first..third].each do |x|
    prod*=x.to_i
    array<<prod
  end
  first+=2
  third = first + 2
end

print array
Run Code Online (Sandbox Code Playgroud)

对于这两段代码,我得到了这个答案:[3,6,30,5,30,210,7,56,504,9,9,18,2],我想要的是:[30,336,18]

谁能告诉我我的代码有什么问题?

先感谢您!

fal*_*tru 5

用途Enumerable#each_slice:

[3,2,5,6,7,8,9,1,2].each_slice(3).map { |a,b,c| a*b*c }
# => [30, 336, 18]
[3,2,5,6,7,8,9,1,2].each_slice(3).map { |x| x.reduce(:*) }
# => [30, 336, 18]
Run Code Online (Sandbox Code Playgroud)

使用String#chars一个字符串转换成单个字符字符串数组.然后使用上面的代码来获得结果:

'325678912'.chars
# => ["3", "2", "5", "6", "7", "8", "9", "1", "2"]
'325678912'.chars.map(&:to_i)
# => [3, 2, 5, 6, 7, 8, 9, 1, 2]
'325678912'.chars.map(&:to_i).each_slice(3).map { |a,b,c| a*b*c }
# => [30, 336, 18]
Run Code Online (Sandbox Code Playgroud)

  • 或者`.map {| x | x.reduce(:*)}`处理任意大小 (3认同)
  • 您可以使用`chars`代替`split('')`,它更清晰,可能更快. (3认同)