从一个Ruby方法传递到另一个Ruby方法时数据是否已损坏?

时间:2017-03-25 23:06:19

标签: ruby methods rspec

我正在尝试将类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

我很欣赏有关我在哪里出错的指示。

2 个答案:

答案 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