Что за треугольник?

Напишите функцию triangle, которая тестирует переданный ей треугольник и возвращает его тип. Треугольники бывают: остроугольными, прямоугольными и тупоугольными. Функция принимает три числа, которые соответствуют длине каждой стороны.

triangle(2, 4, 6); // Не существует
triangle(7, 3, 2); // Не существует
triangle(8, 5, 7); // Остроугольный
triangle(3, 4, 5); // Прямоугольный
triangle(7, 12, 8); // Тупоугольный

Решение

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

var triangle = function(a, b, c) {
  if (a + b <= c || a + c <= b || b + c <= a) {
    return 'Треугольник не существует';
  }
};

Условие выглядит громоздким и трудным для чтения. Его можно немного упростить с помощью методов массивов sort: если отсортировать аргументы по возрастанию, то мы точно будем знать, что на последнем месте будет находиться сторона с наибольшей длиной:

var triangle = function() {
  var args = [].sort.call(arguments);
  if (args[0] + args[1] < args[2]) {
    return 'Треугольник не существует';
  }
};

Недостаток данного способа заключается в том, что функция будет обрабатывать все передаваемы ей аргументы, а не только первые три. Эту проблему достаточно просто решить с помощью метода массивов slice:

var triangle = function() {
  var args = [].slice.call(arguments, 0, 3).sort();
  if (args[0] + args[1] < args[2]) {
    return 'Треугольник не существует';
  }
};

Данное дейтвие также приведёт к преобразованию псевдомассива arguments к массиву, поэтому можно сразу же воспользоваться методом sort.

Итак, что мы уже имеем? Отсортированный по возрастанию массив аргументов и вывод о том, что треугольника не существует. Задача практически решена. Остаётся только сравнивать квадраты длин сторон в соотвествие с правилами:

  1. Если квадраты двух меньших сторон равны квадрату третьей стороны, то треугольник прямогульный.
  2. Если меньше, то — треугольник тупоугольный.
  3. Если больше, то — треугольник остроугольный.

Решение целиком:

var triangle = function() {
  var sides = [].slice.call(arguments, 0, 3).sort();
  if (sides[0] + sides[1] < sides[2]) {
    return 'Треугольник не существует';
  }

  var sum = (Math.pow(sides[0], 2) + Math.pow(sides[1], 2)).toFixed(2);
  var side = Math.pow(sides[2], 2).toFixed(2);

  if (sum === side) { return 'Треугольник прямоугольный'; }
  if (sum < side) { return 'Треугольник тупоугольный'; }
  if (sum > side) { return 'Треугольник остроугольный'; }
};

Тесты

console.log(triangle(2, 4, 6)); // Не существует
console.log(triangle(7, 3, 2)); // Не существует
console.log(triangle(8, 5, 7)); // Остроугольный
console.log(triangle(3, 4, 5)); // Прямоугольный
console.log(triangle(7, 12, 8)); // Тупоугольный

Немного короче с ES6 (посмотреть на babejs.io):

const triangle = (...args) => {
  const sides = args.slice(0, 3).sort();
  if (sides[0] + sides[1] <= sides[2]) {
    return 'Треугольник не существует';
  }

  const sum = (Math.pow(sides[0], 2) + Math.pow(sides[1], 2)).toFixed(2);
  const side = Math.pow(sides[2], 2).toFixed(2);

  if (sum === side) { return 'Треугольник прямоугольный'; }
  if (sum < side) { return 'Треугольник тупоугольный'; }
  if (sum > side) { return 'Треугольник остроугольный'; }
};

Комментарии