我是Ruby的新手,也是一般的编程。我正在通过Ruby Koans工作。在卡住之前我已经达到了176/274 这是“得分项目”我需要写一个方法来计算给定骰子的得分 这可能不是你见过的最优雅的代码,但这就是我想出的:
def score(dice)
tally = 0
tally += (dice.sort.to_s[/[1]+/].length % 3) * 100
if dice.sort.to_s[/[1]+/].length >= 3
tally += 1000
end
tally = tally + (dice.sort.to_s[/[5]+/].length % 3) * 50
if dice.sort.to_s[/[5]+/].length >= 3
tally += 500
end
if dice.sort.to_s[/[2]+/].length >= 3
tally += 200
end
if dice.sort.to_s[/[3]+/].length >= 3
tally += 300
end
if dice.sort.to_s[/[4]+/].length >= 3
tally += 400
end
if dice.sort.to_s[/[6]+/].length >= 3
tally += 600
end
return tally
end
第一个测试是:得分([])需要返回0
当我运行它时,我得到“未定义的方法`长度'为nil:NilClass”(引用的行是.length的第一个实例) 这告诉我“dice.sort.to_s [/ [1] + /]”和“得分([])”是零,但是当我在irb>>中运行它时它是0。
是什么给出了?
答案 0 :(得分:0)
您使用的是什么Ruby版本?我正在使用1.9.2并且我的IRB给了我相同的错误,因为如果没有匹配,正则表达式返回nil。
作为dice = []
边框大小写,您可以在代码的第一行添加一个检查,以便返回0。
我今天做了RubyKoans,尽管如此,我的代码并不比你的代码漂亮,也许它会帮助你一点点:
def score(dice)
points = 0
dice.sort!
nmbrs = Array.new
dice.each { |n|
nmbrs[n] = dice.select { |nm| nm == n}
}
n = 0
nmbrs.each { |vals|
n = n + 1
if(vals.nil?)
next
end
if(vals.count >= 3)
points += (n-1)*100 if (n-1) != 1
points += 1000 if (n-1) == 1
if vals.size > 3
if (n-1) == 1
points += 100 * (vals.size - 3)
else
if (n-1) == 5
points += 50 * (vals.size - 3)
end
end
end
else
points += 100 * (vals.count) if (n-1) == 1
points += 50 * (vals.count) if (n-1) == 5
end
}
points
end
对于糟糕的功能感到抱歉,但它确实有效,因此它可能会让您了解如何解决该特定问题。
祝你好运!答案 1 :(得分:0)
行。明白了。
巨大的道歉,我曾说过,运行“dice.sort.to_s [/ [1] + /]”返回零而不是零,它一定是因为它有一些我不知道的值。当我运行“[] .sort.to_s [/ [1] + /]时,它正确地返回了nil。因此,我在检查中嵌套了每个if语句,以确保没有nil值。
def score(dice)
tally = 0
if dice.sort.to_s[/[1]+/]
tally += (dice.sort.to_s[/[1]+/].length % 3) * 100
if dice.sort.to_s[/[1]+/].length >= 3
tally += 1000
end
end
if dice.sort.to_s[/[5]+/]
tally += (dice.sort.to_s[/[5]+/].length % 3) * 50
if dice.sort.to_s[/[5]+/].length >= 3
tally += 500
end
end
if dice.sort.to_s[/[2]+/]
if dice.sort.to_s[/[2]+/].length >= 3
tally += 200
end
end
if dice.sort.to_s[/[3]+/]
if dice.sort.to_s[/[3]+/].length >= 3
tally += 300
end
end
if dice.sort.to_s[/[4]+/]
if dice.sort.to_s[/[4]+/].length >= 3
tally += 400
end
end
if dice.sort.to_s[/[6]+/]
if dice.sort.to_s[/[6]+/].length >= 3
tally += 600
end
end
return tally
end
所有测试通过。