毕达哥拉斯三角形,任何一边等于零

时间:2014-04-19 20:39:52

标签: ruby

所以我有这个我想解决的规范(我没有写规范)......

  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

如何通过我的规范?我错过了什么?

2 个答案:

答案 0 :(得分:3)

主要问题是,当测试置换abc的值时,您的方法并不总是检查它是否等于斜边的平方其他两边的平方和。例如,如果a=3b=4c=5,您的某个测试将为4*4 + 5*5 == 3*3。在检查平方和之前,您需要对abc进行排序,这无论如何都是个好主意,因为参数之间的斜边位置无法保证。您也可以稍微简化一下代码。这是你可以写的一种方式:

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"而不是falsetrue,同时检查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