比较数组元素与哈希键并将哈希值附加到数组

时间:2020-07-05 17:51:45

标签: arrays ruby hash control-flow

SCORECARD = {
   "1" => 40,
   "2" => 100,
   "3" => 300,
   "4" => 1200
}


def get_score(arr)
  
   score_base = []
  
   #level = getPoints(arr) / 10
   score_base = calculateScore(arr)

end

def getPoints(points)
    points.inject(0) do |sum, point|
       sum + point
    end
end


def calculateScore(lines)
    score_base = []  
    lines.each do |line|
  
        SCORECARD.each do |key, value|
  
            if line == key
                score_base << value
            end
            score_base
        end
     end
end
  

describe "Basic tests" do
  Test.assert_equals(get_score([0, 1, 2, 3, 4]), 1640)
  Test.assert_equals(get_score([0, 1, 1, 3, 0, 2, 1, 2]), 620)
  Test.assert_equals(get_score([2, 0, 4, 2, 2, 3, 0, 0, 3, 3]), 3300)
end

describe "Special tests" do
  Test.assert_equals(get_score([0]), 0)
  Test.assert_equals(get_score([]), 0)
end

Test Results:
Basic tests
Expected: 1640, instead got: [0, 1, 2, 3, 4]
Expected: 620, instead got: [0, 1, 1, 3, 0, 2, 1, 2]
Expected: 3300, instead got: [2, 0, 4, 2, 2, 3, 0, 0, 3, 3]
STDERR
/runner/frameworks/ruby/cw-2.rb:60:in `block in describe': Expected: 1640, instead got: [0, 
1, 2, 3, 4] (Test::Error)
    from /runner/frameworks/ruby/cw-2.rb:46:in `measure'
    from /runner/frameworks/ruby/cw-2.rb:51:in `describe'
    from /runner/frameworks/ruby/cw-2.rb:202:in `describe'
    from main.rb:46:in `<main>'

问题:我需要调试calculateScore方法的帮助。本质上,我想遍历lines数组和SCORECARD哈希,然后检查当前行是否等于哈希键,最后将匹配键的值推送到score_base数组中

一旦我将所有值都放入score_base数组中,我计划将score_base数组中的每个元素乘以用户当前的水平,然后将所有元素求和成{{1} }。

输出似乎只返回lines数组中的元素。有人可以阐明正在发生的事情吗?

编辑:我的解决方案

totalScore

编辑:响应Bobodes反馈:重新计算计算方式

```
SCORECARD = {
  "1" => 40,
  "2" => 100,
  "3" => 300,
  "4" => 1200
}

def get_score(arr)
  totalScore = multiplyByLevel(arr)
end

def calculateScore(line)
  score_base = []
  
   score_base.push SCORECARD.fetch(line.to_s, 0)  
   score_base.reduce(:+)
end

def multiplyByLevel(points)
  experience = 1.0
  level = 0
  totalScore = 0
  
  points.each do |point|
   
    experience = experience.round(1) + (point.to_f / 10)
  
    if level < 2
      totalScore = totalScore + (1 * calculateScore(point))
    elsif level >= 2
      totalScore = totalScore + (level.round(1) * calculateScore(point))
    else
      print "Outside loop, level is #{level}"
    end
    level = experience.to_i
    
  end  
  
  totalScore
end
```

2 个答案:

答案 0 :(得分:0)

数组的each方法返回数组本身(来自docs:“每个{| item | block}→ary”),这就是您所得到的。查看map。请注意,getPoints方法实际上并未使用,因此不会计算总和

答案 1 :(得分:0)

您的基本问题是#each总是返回接收方( receiver .each左侧的任何内容)。让我们看看您的代码:

def calculateScore(lines)
  score_base = []  
  lines.each do |line|
    SCORECARD.each do |key, value|
      if line == key
        score_base << value
      end
      score_base
    end # << returns SCORECARD
  end # << returns lines
end 

因此,您需要在此处放置score_base

def calculateScore(lines)
  score_base = []  
  lines.each do |line|
    SCORECARD.each do |key, value|
      if line == key
        score_base << value
      end
    end # << returns SCORECARD
  end # << returns lines
  score_base
end 

这是对斯坦斯拉格答案第一部分的解释,但我还将看看他的其余建议。

您的代码还有另一个问题。 SCORECARD中的键是字符串,而测试输入中lines的键是整数。因此,一旦解决了所问的问题,您的结果总会得到一个空数组。

但是您的代码还有一个更大的问题,那就是您可以使用#map来获得所需的内容,而只需一行简单的代码!您当然可以在仍然使用#each的情况下精简代码,但是#map旨在在遍历它们的同时转换值,而#each则只是遍历它们。您想将值(从SCORECARD键转换为SCORECARD值),所以#map是最简单的方法。

我不想带走所有的乐趣,为您做这件事,所以这里是#map的简单示例:

[1, 2, 3, 4].map { |num| num + 1 } #=> [2, 3, 4, 5]

查看您是否可以将测试输入[0, 1, 2, 3, 4]用作想法并返回[nil, 40, 100, 300, 1200]。然后,找出如何将所有这些值加在一起(有一种方法可以删除nil值,您会发现这很有用)。您将获得一线希望。