我正在尝试将类Integer
的几个参数传递给两个方法之一 - pick由传递给初始方法的最终参数决定。
问题以完整here描述,但简而言之,我的方法应正确计算否。当多个数字与最终参数:problem => :count_clumps
一起传入时,2个相同数字的链数。
即。 problem_14(1, 2, 2, 2, 2, 3, 4, 4, :problem => :count_clumps)
应返回2
,因为它包含2个2位以上相同数字的链。
我没有通过以下的rspec测试:
problem_14(1, 2, 2, 3, 4, 4, :problem => :count_clumps)
我的方法应该返回2
,但它们会返回0
。
我认为问题在于problem_14
传递给count_clumps
的问题。 count_clumps
在直接测试时传递rspec测试,但在通过problem_14
调用时返回错误的结果。
def problem_14(*parameters)
if parameters[-1].is_a?(Hash)
parameters.pop[:problem] == :same_ends ? same_ends(parameters) : count_clumps(parameters)
else
count_clumps(parameters)
end
end
def same_ends(n, *array)
return true if n == 0
array[0..n-1] == array[-n..-1]
end
def count_clumps(*array)
count = 0
clump = false
array.each_index do |x|
if array[x] == array[x+1]
clump = true
else
count += 1 if clump
clump = false
end
end
return count
end
我很欣赏有关我在哪里出错的指示。
答案 0 :(得分:2)
在ruby中,splat(*)运算符获取所有参数并将它们转换为数组。所以当你这样做时:
def problem_14(*parameters)
您正在获取一系列参数并将它们放入名为parameters
的数组中。然后,当您致电count_clumps(parameters)
时,您正在传入一个数组,但由于您的count_clumps
方法还需要一个参数列表转换为数组:
def count_clumps(*array)
你最终得到的是一个双数组,如下所示:
[[1, 2, 2, 2, 2, 3, 4, 4]]
修复实际上非常简单。如果有数组,可以使用splat(*)将其重新转换为参数列表。就这样做:
parameters.pop[:problem] == :same_ends ? same_ends(*parameters) : count_clumps(*parameters)
答案 1 :(得分:0)
这有几个问题。首先,数组需要展平,而不是将值与下一个索引进行比较,而不是将值与值+ 1进行比较。
def count_clumps(*array)
count = 0
clump = false
array = array.flatten
array.each_with_index do |x, a|
if x == array[a+1]
clump = true
else
count += 1 if clump
clump = false
end
end
return count
end
puts problem_14(1, 2, 2, 3, 4, 4, :problem => :count_clumps)
=> 2
puts problem_14(1, 1, 2, 1, 1, problem: :count_clumps)
=> 2
puts problem_14(1, 1, 1, 1, problem: :count_clumps)
=> 1