Ruby Koan 151 поднимает исключения - PullRequest
45 голосов
/ 30 сентября 2010

Я прохожу рубиновые коаны, я на 151, и я просто ударился о кирпичную стену.

Вот этот коан:

# You need to write the triangle method in the file 'triangle.rb'
require 'triangle.rb'

class AboutTriangleProject2 < EdgeCase::Koan
  # The first assignment did not talk about how to handle errors.
  # Let's handle that part now.
  def test_illegal_triangles_throw_exceptions
    assert_raise(TriangleError) do triangle(0, 0, 0) end
    assert_raise(TriangleError) do triangle(3, 4, -5) end
    assert_raise(TriangleError) do triangle(1, 1, 3) end
    assert_raise(TriangleError) do triangle(2, 4, 2) end
 end
end

Затем в triangle.rbу нас есть:

def triangle(a, b, c)
  # WRITE THIS CODE
  if a==b && a==c
    return :equilateral
  end
  if (a==b && a!=c) || (a==c && a!=b) || (b==c && b!=a)
    return :isosceles
  end
  if a!=b && a!=c && b!=c
    return :scalene
  end
  if a==0 && b==0 && c==0
    raise new.TriangleError
  end



end

# Error class used in part 2.  No need to change this code.
class TriangleError < StandardError

end

Я не в замешательстве - любая помощь будет высоко ценится!

РЕДАКТИРОВАТЬ: Чтобы завершить этот коан, мне нужно поместить что-то в класс TriangleError - ноЯ понятия не имею, что

ОБНОВЛЕНИЕ: Вот что говорит вещь о кар-каре:

<TriangleError> exception expected but none was thrown.

Ответы [ 36 ]

0 голосов
/ 03 января 2013

Леон выигрывает в элегантной элегантности, Бенджи за знание API Array. Вот мой грубый элегантный ответ:

def triangle(a, b, c)
   [a, b, c].each { | side | raise TriangleError, "Sides must be positive" unless side > 0 }
   raise TriangleError, "Two sides can never be less than or equal to third side" if ((a + b) <= c) | ((a + c) <= b) | ((b + c) <= a)

   return :equilateral if (a == b) && (b == c)
   return :isosceles if (a == b) || (b == c) || (a == c)
   return :scalene
end
0 голосов
/ 04 января 2013

Нет. Необходимо изменить код TriangleError для любой задачи.Вам просто нужно проверить на наличие неправильных треугольников и поднять ошибку, если треугольника нет.

def triangle(a, b, c)
  if a==0 && b==0 && c==0
    raise TriangleError, "This isn't a triangle"
  end
  if a <0 or b < 0 or c <0
    raise TriangleError, "Negative length - thats not right"
  end
  if a + b <= c  or a + c <= b or  b + c <= a
    raise TriangleError, "One length can't be more (or the same as) than the other two added together.  If it was the same, the whole thing would be a line.  If more, it wouldn't reach. "
  end    
  # WRITE THIS CODE
  if a == b and b == c 
    return :equilateral    
  end      
  if (a==b or b == c or a == c) 
    return :isosceles
  end 
  :scalene      
end
0 голосов
/ 23 февраля 2018

Вы можете использовать эту формулу и проверить все случаи:

  • a + b> c
  • a + c> b
  • b + c> a

и вы набираете код:

def triangle(a, b, c)
  # Validate the triangle
 raise TriangleError, "The triangle is not valid" unless (a + b) > c && (a + c) > b && (b + c) > a

 if a === b && b === c
  :equilateral
 elsif a === b || a === c || b === c
  :isosceles
 else
  :scalene
 end
end
0 голосов
/ 25 декабря 2014

Нет необходимости писать метод TriangleError.Там написано «Нет необходимости менять этот код», поэтому я не буду его менять вообще.Упрямый, как я.

4 стреляли, хорошо и чисто.

    def triangle(a, b, c)
         if(a * b * c <= 0) || (( (a + c)<=b) || ((a + b)<=c)||((b + c)<=a) )
             raise TriangleError else
             return  ((a == b && b == c && a == c)?  :equilateral:(((a == b)||(b == c)||(a == c))?  :isosceles:  :scalene))
         end
    end


# Error class used in part 2.  No need to change this code.
class TriangleError < StandardError
end
0 голосов
/ 29 августа 2018

Мое решение, я думаю, оно одно из самых читаемых:

def triangle(a, b, c)
  a, b, c = [a, b, c].sort
  if a <= 0 or c >= a + b
    raise TriangleError
  end
  case [a, b, c].uniq.length
  when 1
    :equilateral
  when 2
    :isosceles
  when 3
    :scalene
  end
end
0 голосов
/ 12 мая 2013

На StackOverflow есть несколько совершенно замечательных людей ... Мне напоминают об этом каждый раз, когда я посещаю: D Просто чтобы внести свой вклад в разговор, вот решение, которое я придумал:

def triangle(a, b, c)
    raise TriangleError if [a,b,c].min <= 0
    x,y,z = [a,b,c].sort
    raise TriangleError if x + y <= z

    equal_sides = 0
    equal_sides +=1 if a == b
    equal_sides +=1 if a == c
    equal_sides +=1 if b == c

    # Note that equal_sides will never be 2.  If it hits 2 
    # of the conditions, it will have to hit all 3 by the law
    # of associativity
    return [:scalene, :isosceles, nil, :equilateral][equal_sides] 
end 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...