Напишите функцию 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
.
Итак, что мы уже имеем? Отсортированный по возрастанию массив аргументов и вывод о том, что треугольника не существует. Задача практически решена. Остаётся только сравнивать квадраты длин сторон в соотвествие с правилами:
- Если квадраты двух меньших сторон равны квадрату третьей стороны, то треугольник прямогульный.
- Если меньше, то — треугольник тупоугольный.
- Если больше, то — треугольник остроугольный.
Решение целиком:
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 'Треугольник остроугольный'; }
};