我试图将两个不同数组中两个数组元素的值从头到尾相加,以查看该总和是否大于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
答案 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#zip
和Enumerable#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_a
。 Array#count
方法返回块产生truthy值的次数。
在repl.it上查看:https://repl.it/FXpa