freeCodeCamp/curriculum/challenges/italian/10-coding-interview-prep/project-euler/problem-94-almost-equilater...

2.0 KiB

id title challengeType forumTopicId dashedName
5900f3ca1000cf542c50fedd Problem 94: Almost equilateral triangles 5 302211 problem-94-almost-equilateral-triangles

--description--

It is easily proved that no equilateral triangle exists with integral length sides and integral area. However, the almost equilateral triangle 5-5-6 has an area of 12 square units.

We shall define an almost equilateral triangle to be a triangle for which two sides are equal and the third differs by no more than one unit.

Find the sum of the perimeters of all almost equilateral triangles with integral side lengths and area and whose perimeters do not exceed limit.

--hints--

almostEquilateralTriangles(50) should return a number.

assert(typeof almostEquilateralTriangles(50) === 'number');

almostEquilateralTriangles(50) should return 66.

assert.strictEqual(almostEquilateralTriangles(50), 66);

almostEquilateralTriangles(10000) should return 3688.

assert.strictEqual(almostEquilateralTriangles(10000), 3688);

almostEquilateralTriangles(10000000) should return 9973078.

assert.strictEqual(almostEquilateralTriangles(10000000), 9973078);

almostEquilateralTriangles(1000000000) should return 518408346.

assert.strictEqual(almostEquilateralTriangles(1000000000), 518408346);

--seed--

--seed-contents--

function almostEquilateralTriangles(limit) {

  return true;
}

almostEquilateralTriangles(50);

--solutions--

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;
}