2

この問題の単純さを許してください。私はTDDについて学んでおり、次のステートメントがあります。

def test_equilateral_triangles_have_equal_sides
   assert_equal :equilateral, triangle(2, 2, 2)
   assert_equal :equilateral, triangle(10, 10, 10)
end

def test_isosceles_triangles_have_exactly_two_sides_equal
  assert_equal :isosceles, triangle(3, 4, 4)
  assert_equal :isosceles, triangle(4, 3, 4)
  assert_equal :isosceles, triangle(4, 4, 3)
  assert_equal :isosceles, triangle(10, 10, 2)
end

def test_scalene_triangles_have_no_equal_sides
  assert_equal :scalene, triangle(3, 4, 5)
  assert_equal :scalene, triangle(10, 11, 12)
  assert_equal :scalene, triangle(5, 4, 2)
end

私はこの問題に対して非常に基本的な解決策を作成し、より経験豊富なプログラマーから別の解決策についてフィードバックを得たいと考えました。

私のコード:

def triangle(a, b, c)
  if (a == b) && (a == c) && (b == c)
    :equilateral
  elsif (a == b) && ((a || b) != c)
    :isosceles
  elsif (a == c) && ((a || c) != b)
    :isosceles
  elsif (b == c) && ((b || c) != a)
    :isosceles
  else
    :scalene
end
4

4 に答える 4

7

側面をソートすることで、状態チェックを容易にすることができます

sides = [a, b, c].sort
return :equilateral if sides[0] == sides[2]
return :isosceles if sides[0] == sides[1] || sides[1] == sides[2]
return :scalene

または、さらに簡単な方法は、次を使用して一意の面の数を数えることです.uniq

sides = [a, b, c].uniq
type = case sides.length
        when 1 then :equilateral 
        when 2 then :isosceles 
        when 3 then :scalene
       end
于 2012-12-06T21:05:06.397 に答える
2

あなたの条件の多くは冗長です。a==b かつ a==c の場合、b==c は必然です。また、最初の条件が false で a==b の場合、c はそれらのいずれとも等しくないか、最初の条件が true でした。したがって、次のように単純化できます。

def triangle(a, b, c)
  if (a == b) && (a == c)
    :equilateral
  elsif (a == b) || (a == c) || (b == c)
    :isosceles
  else
    :scalene
  end
end
于 2012-12-06T20:40:42.337 に答える
2

2 つのコメント。まず、通常、テストで陽性ケースを確認し、失敗をチェックします ( assert_not_equal)。

triangleやり方をもう少しきつくしてもいいと思います。

考えてみてa == bくださいb == c:a == c

考慮してください:三角形が二等辺三角形である場合a == b、またはb == cその場合a == c

考慮してください: 最初に満たされた条件は、他の実行を妨げ、他のケースも除外します。

于 2012-12-06T20:41:16.410 に答える
0

これはあなたをカバーするはずです:

def triangle(a, b, c)

  raise TriangleError, 'Sum of two sides must be greater than the third.' if a + b < c || b + c < a || a + c < b # not a triangle!
  raise TriangleError, 'Sum of two sides must not be equal to the third.' if a + b == c || b + c == a || a + c == b # degenerate triangle!

  return :equilateral  if a == b && a == c
  return :isosceles    if a == b || b == c || a == c
  return :scalene      if a != b && b != c && a != c

end

Ruby Koans の進歩に感謝します! :-)

于 2013-05-10T21:18:21.270 に答える