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


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方法的帮助。本质上,我想遍历行数组和SCORECARD哈希,然后检查当前行是否等于哈希键,最后将匹配键的值推送到score_base数组中。

将所有值推入score_base数组后,我计划将score_base数组中的每个元素乘以用户的当前级别,然后将所有元素相加totalScore

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

编辑:我的问题解决方案

```
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
```

编辑:响应BOBRODES反馈:重构计算分数方法

```
def calculateScore(lines)
score_base = []
lines.map {|line| score_base << SCORECARD[line.to_s]}
score_base.compact
end
#=> [40,100,300,1200]
```

您的基本问题是#each总是返回接收器(接收器.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 

这是对steenslag回答的第一部分的解释,但我也会看看他的其余建议。

您的代码还有另一个问题。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您会发现有用的值(,您将拥有单行代码。

数组的each方法返回数组本身(来自文档:"each {|item| block} → ary"( 所以这就是你得到的。查看地图。请注意,实际上并未使用getPoints方法,因此不计算总和

相关内容

  • 没有找到相关文章

最新更新