Files
freeCodeCamp/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-94-almost-equilateral-triangles.md

85 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: 5900f3ca1000cf542c50fedd
title: 'Завдання 94: Майже рівносторонні трикутники'
challengeType: 5
forumTopicId: 302211
dashedName: problem-94-almost-equilateral-triangles
---
# --description--
Відомо, що не існує рівностороннього трикутника з цілочисельними сторонами і площею. Однак майже рівносторонній трикутник 5-5-6 має площу 12 квадратних одиниць.
Визначимо <dfn>майже рівносторонній трикутник</dfn> як трикутник, у якого дві сторони рівні, а третя відрізняється не більше ніж на одну одиницю.
Знайдіть суму периметрів усіх майже рівносторонніх трикутників з цілочисельними сторонами і площею, периметри яких не перевищують `limit`.
# --hints--
`almostEquilateralTriangles(50)` має повернути число.
```js
assert(typeof almostEquilateralTriangles(50) === 'number');
```
`almostEquilateralTriangles(50)` має повернути `66`.
```js
assert.strictEqual(almostEquilateralTriangles(50), 66);
```
`almostEquilateralTriangles(10000)` має повернути `3688`.
```js
assert.strictEqual(almostEquilateralTriangles(10000), 3688);
```
`almostEquilateralTriangles(10000000)` має повернути `9973078`.
```js
assert.strictEqual(almostEquilateralTriangles(10000000), 9973078);
```
`almostEquilateralTriangles(1000000000)` має повернути `518408346`.
```js
assert.strictEqual(almostEquilateralTriangles(1000000000), 518408346);
```
# --seed--
## --seed-contents--
```js
function almostEquilateralTriangles(limit) {
return true;
}
almostEquilateralTriangles(50);
```
# --solutions--
```js
function almostEquilateralTriangles(limit) {
// Based on https://blog.dreamshire.com/project-euler-94-solution/
let perimetersSum = 0;
let sidesAB = 1;
let sideC = 1;
let perimeter = 0;
let perimeterOffset = 1;
while (perimeter <= limit) {
[sidesAB, sideC] = [4 * sidesAB - sideC + 2 * perimeterOffset, sidesAB];
perimeterOffset = -perimeterOffset;
perimetersSum += perimeter;
perimeter = 3 * sidesAB - perimeterOffset;
}
return perimetersSum;
}
```