所以我有这个我想解决的规范(我没有写规范)......
it "returns false if any of the arguments are 0" do
# [0, 1, 1].permutation(3) returns all permutations of [0, 1, 1]
length = rand(0.01..100.0)
[0, length, length].permutation(3).all? { |(a,b,c)| valid_triangle?(a,b,c) }.should be_false
end
这是我的代码
def valid_triangle?(a, b, c)
#A Pythagorean triple consists of three positive integers a, b, and c, such that a2 + b2 = c2.
if a > 0 && b > 0 && c > 0
one = a**2
two = b**2
three = c**2
if one+two=three
return "true"
else
return "false"
end
else
return "false"
end
end
如何通过我的规范?我错过了什么?
答案 0 :(得分:3)
主要问题是,当测试置换a
,b
和c
的值时,您的方法并不总是检查它是否等于斜边的平方其他两边的平方和。例如,如果a=3
,b=4
和c=5
,您的某个测试将为4*4 + 5*5 == 3*3
。在检查平方和之前,您需要对a
,b
和c
进行排序,这无论如何都是个好主意,因为参数之间的斜边位置无法保证。您也可以稍微简化一下代码。这是你可以写的一种方式:
TOLERANCE = 0.01
def right_triangle?(a, b, c)
return false if a == 0 || b == 0 || c == 0
a, b, c = [a,b,c].sort
(a**2 + b**2 - c**2).abs < TOLERANCE
end
length = rand(0.01..100.0)
[0.0, length, length].permutation(3).all? { |(a,b,c)| right_triangle?(a,b,c)}
#=> false
[3,4,5].permutation(3).all? { |(a,b,c)| right_triangle?(a,b,c) }
#=> true
由于您正在处理浮点数,因此在比较相等值时需要建立一定程度的容差。为了演示目的,我使用了任意固定数量(0.01
)。
答案 1 :(得分:2)
您将返回"false"
和"true"
而不是false
和true
,同时检查one+two=three
,何时应该检查one+two==three
(等于支票,而非转让)
def valid_triangle?(a, b, c)
#A Pythagorean triple consists of three positive integers a, b, and c, such that a2 + b2 = c2.
if a > 0 && b > 0 && c > 0
one = a**2
two = b**2
three = c**2
if one+two == three
return true
else
return false
end
else
return false
end
end