Массив "треугольников"
У нас есть массив A элементы которой являются натуральными числами. Нужно написать функцию, которая получает массив A и возвращает массив B из трех элементов так, чтобы тремя элементами массива B нужно было бы построить треугольник с наибольшей площадью.
Площадь треугольника для сторон a, b, c нужно найти следующим образом
S = Math.sqrt(p * (p - a) * (p - b) * (p - c)), где p = (a + b + c) / 2
Например:
если дан массив A = [5, 4, 2, 1, 3, 2] то получим массив B = [5, 4, 3]
function greatAreaTriangle () {}
console.log(greatAreaTriangle ([5, 4, 2, 1, 3, 2])) // [5, 4, 3]
console.log(greatAreaTriangle ([3, 4, 8, 10, 13])) // [8, 10, 13]
console.log(greatAreaTriangle ([0, 12, 0, 0, 15, 0, 10, 0])) // [12, 15, 10]
console.log(greatAreaTriangle ([5, 4, 3, 10, 1, 2])) // [5, 4, 3]
Поможете решить задачу?
Ответы (1 шт):
Автор решения: OPTIMUS PRIME
→ Ссылка
let log = e => console.log(JSON.stringify(e));
log( greatAreaTriangle([100, 51, 50, 49, 48]) );
log( greatAreaTriangle([5, 4, 2, 1, 3, 2]) );
log( greatAreaTriangle([3, 4, 8, 10, 13]) );
log( greatAreaTriangle([0, 12, 0, 0, 15, 0, 10, 0]) );
log( greatAreaTriangle([5, 4, 3, 10, 1, 2]) );
log( greatAreaTriangle([1000, 50, 400]) );
/***/
function greatAreaTriangle(arr) {
let sorted = arr.slice().sort( (a, b) => b - a ); // Сортировка чисел по убыванию
// slice без аргументов - копирует массив, чтобы сортировка не модифицировала `arr`
let biggestArea = getArea(sorted[0], sorted[1], sorted[2]);
// Поиск наибольшей площади
for( let i = 1; i < sorted.length - 2; i++ ){
let attempt = getArea(sorted[i], sorted[i+1], sorted[i+2]);
if( biggestArea.area < attempt.area ) biggestArea = attempt;
}
return biggestArea.area ? getInitOrderedSides(arr, biggestArea) : null;
// См. "Тернарный оператор"
/****/
function getInitOrderedSides(arr, obj){
// Из объекта достаются стороны треугольника,
// и сортируются по индексу в начальном массиве.
return [obj.a, obj.b, obj.c].sort( (a, b) => arr.indexOf(a) - arr.indexOf(b) );
}
}
function getArea(a, b, c) {
let p = (a + b + c) / 2;
let body = p * (p - a) * (p - b) * (p - c);
return {
area: body <= 0 ? 0 : Math.sqrt(p * (p - a) * (p - b) * (p - c)),
a,
b,
c,
};
}