Ruby Koan 151 raising exceptions

后端 未结 30 1621
孤独总比滥情好
孤独总比滥情好 2021-01-31 14:34

I\'m going through the ruby koans, I\'m on 151 and I just hit a brick wall.

Here is the koan:

# You need to write the triangle method in the file \'trian         


        
相关标签:
30条回答
  • 2021-01-31 15:09

    your previous triangle method should appear here

    class TriangleError < StandardError
    end
    
    def triangle(x,y,z)
      if(x>=y+z||y>=x+z||z>=x+y)
        raise TriangleError,"impossible triangle"
      elsif(x==0&&y==0&&z==0)||(x<0||y<0||z<0)
        raise TriangleError,"length cannot be zero or negative"
      elsif(x==y&&x==z)
        :equilateral
      elsif(x==y||y==z||x==z)
        :isosceles
      else
        :scalene
      end
    end
    
    0 讨论(0)
  • 2021-01-31 15:10

    You definately do not update the TriangleError class - I am stuck on 152 myself. I think I need to use the pythag theorem here.

    def triangle(a, b, c)
      # WRITE THIS CODE
    
      if a == 0 || b == 0 || c == 0
        raise TriangleError
      end
    
      # The sum of two sides should be less than the other side
      if((a+b < c) || (a+c < b) || (b+c < a))
        raise TriangleError
      end
      if a==b && b==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
    
    
    end
    
    # Error class used in part 2.  No need to change this code.
    class TriangleError < StandardError
    end
    
    0 讨论(0)
  • 2021-01-31 15:11

    I wanted a method that parsed all arguments effectively instead of relying on the order given in the test assertions.

    def triangle(a, b, c)
      # WRITE THIS CODE
      [a,b,c].permutation { |p| 
         if p[0] + p[1] <= p[2]
           raise TriangleError, "Two sides of a triangle must be greater than the remaining side."
         elsif p.count { |x| x <= 0} > 0
           raise TriangleError, "A triangle cannot have sides of zero or less length."
         end
      }
    
      if [a,b,c].uniq.count == 1
        return :equilateral
      elsif [a,b,c].uniq.count == 2
        return :isosceles
      elsif [a,b,c].uniq.count == 3
        return :scalene
      end
    end
    

    Hopefully this helps other realize there is more than one way to skin a cat.

    0 讨论(0)
  • 2021-01-31 15:14

    No need to write the TriangleError method. It says 'No need to change this code', so I won't change it at all. Stubborn as I am.

    4lines shot it, nice nd clean.

        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 讨论(0)
  • 2021-01-31 15:15

    I like Cory's answer. But I wonder if there's any reason or anything to gain by having four tests, when you could have two:

    raise TriangleError, "Sides must by numbers greater than zero" if (a <= 0) || (b <= 0) || (c <= 0)
    raise TriangleError, "No two sides can add to be less than or equal to the other side" if (a+b <= c) || (a+c <= b) || (b+c <= a)
    
    0 讨论(0)
  • 2021-01-31 15:15

    Here is my elegant answer, with a lot of help from the comments above

    def triangle(a, b, c)
    
       test_tri = [a,b,c]
    
       if test_tri.min <=0
         raise TriangleError
       end
    
       test_tri.sort!
    
       if test_tri[0]+ test_tri[1] <= test_tri[2]
         raise TriangleError
       end
    
       if a == b and b == c
         :equilateral
       elsif a != b and b != c and a != c 
         :scalene   
       else
         :isosceles     
       end
    end
    
    0 讨论(0)
提交回复
热议问题