tracks/nim/exercises/triangle/example.nim in trackler-2.2.1.138 vs tracks/nim/exercises/triangle/example.nim in trackler-2.2.1.139

- old
+ new

@@ -1,25 +1,25 @@ -import math +import sequtils -type - TriangleKind* = enum - tkEquilateral, - tkIsosceles, - tkScalene +proc valid(a, b, c: int): bool = + let greatThenZero = all([a, b, c], proc (x: int): bool = return x > 0) + let equalityCheck = (a + b >= c) and (a + c >= b) and (b + c >= a) -proc checkInvalidSide(f: float) = - let fc = classify(f) - if not (fc == fcNormal or fc == fcSubnormal) or f < 0: - raise newException(ValueError, "invalid side: " & $f) + greatThenZero and equalityCheck -proc kind*(a, b, c: float): TriangleKind = - checkInvalidSide(a) - checkInvalidSide(b) - checkInvalidSide(c) - if a + b <= c or a + c <= b or b + c <= a: - raise newException(ValueError, "one side is larger than the other two combined") - elif a == b and b == c: - return tkEquilateral - elif a == b or b == c or a == c: - return tkIsosceles - else: - return tkScalene +proc is_equilateral*(sides: array[3, int]): bool = + let a = sides[0] + let b = sides[1] + let c = sides[2] + valid(a, b, c) and all(sides, proc (x: int): bool = return a == x) + +proc is_isosceles*(sides: array[3, int]): bool = + let a = sides[0] + let b = sides[1] + let c = sides[2] + valid(a, b, c) and (a == b or b == c or a == c) + +proc is_scalene*(sides: array[3, int]): bool = + let a = sides[0] + let b = sides[1] + let c = sides[2] + valid(a, b, c) and not is_isosceles(sides)