试图从两个不同的数组中求和数组元素值

时间:2017-01-27 21:56:32

标签: arrays ruby element

我试图将两个不同数组中两个数组元素的值从头到尾相加,以查看该总和是否大于9.

我已经测试了我的代码,而那些不起作用的部分是。

if halfa[i] + halfb[i] > 9

有谁知道我哪里出错了?任何帮助将非常感激。

 text = gets.chomp


    half1 = text.slice(0,10)
    half2 = text.slice(text.length - 10,text.length)
    puts half1
    puts half2

    halfa = half1.split("")
    halfb = half2.split("")

    halfa.map! { |i| i.to_i }
    halfb.map! { |i| i.to_i }

    count = 0

      for i in halfa.length.downto(0)
          if halfa[i] + halfb[i] > 9
              count += 1
          end
      end

    print count

4 个答案:

答案 0 :(得分:2)

您在这里遇到了一个错误的错误,这是一个典型的编程错误,您开始迭代i是数组的长度,但halfa[5]是{{ 1}},数组从0到4。

这里的问题是您使用笨重的nil循环方法进行迭代。与几乎所有其他语言不同,Ruby避免使用迭代器方法:

for

这是你所拥有的最直接的翻译。请注意,如果代码以类似Ruby的符号表示,则可以大大清理代码:

halfa.each_index do |i|
  if halfa[i] + halfb[i] > 9
    count += 1
  end
end

答案 1 :(得分:2)

重构代码的一种方法是使用Array#zipEnumerable#count

text   = "123456789098765"
n      = 10

digits = text.chars.map(&:to_i)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 9, 8, 7, 6, 5]

first  = digits.first(n)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
last   = digits.last(n)
# [6, 7, 8, 9, 0, 9, 8, 7, 6, 5]
pairs  = first.zip(last)
# [[1, 6], [2, 7], [3, 8], [4, 9], [5, 0], [6, 9], [7, 8], [8, 7], [9, 6], [0, 5]]

count  = pairs.count{ |a, b| a + b > 9 }
# 6

答案 2 :(得分:1)

for i in halfa.length.downto(0):halfa.length为10,但是数组具有从零开始的索引:以0开始计数。halfa[10]不存在。

for i in (halfa.length-1).downto(0)会导致 - 好吧,至少是某种东西。

答案 3 :(得分:0)

您的for循环将从halfa.length开始,即10. halfa中的最高索引为9,因此halfa[10]返回{ {1}}。

您可以通过将nil更改为halfa.length来解决此问题,但您仍然可以使用一些非常简单的代码。在Ruby中,很少见到(halfa.length - 1),因为几乎总有一个更好的选择。例如:

for

上面的代码假定文本将包含偶数个字符。如果您愿意,也可以将text = "31415926535897932384" half_size = text.size / 2 count = half_size.times.count do |i| text[i].to_i + text[i+half_size].to_i > 9 end puts count # => 4 硬编码为10.

Integer#times方法将通过其接收器枚举数字0,例如half_size返回5.times.to_aArray#count方法返回块产生truthy值的次数。

在repl.it上查看:https://repl.it/FXpa