freeCodeCamp/curriculum/challenges/portuguese/10-coding-interview-prep/project-euler/problem-199-iterative-circl...

2.2 KiB

id title challengeType forumTopicId dashedName
5900f4341000cf542c50ff46 Problem 199: Iterative Circle Packing 5 301837 problem-199-iterative-circle-packing

--description--

Three circles of equal radius are placed inside a larger circle such that each pair of circles is tangent to one another and the inner circles do not overlap. There are four uncovered "gaps" which are to be filled iteratively with more tangent circles.

a diagram of non-overlapping concentric circles

At each iteration, a maximally sized circle is placed in each gap, which creates more gaps for the next iteration. After 3 iterations (pictured), there are 108 gaps and the fraction of the area which is not covered by circles is 0.06790342, rounded to eight decimal places.

What fraction of the area is not covered by circles after n iterations? Give your answer rounded to eight decimal places using the format x.xxxxxxxx .

--hints--

iterativeCirclePacking(10) should return a number.

assert(typeof iterativeCirclePacking(10) === 'number');

iterativeCirclePacking(10) should return 0.00396087.

assert.strictEqual(iterativeCirclePacking(10), 0.00396087);

iterativeCirclePacking(3) should return 0.06790342.

assert.strictEqual(iterativeCirclePacking(3), 0.06790342);

--seed--

--seed-contents--

function iterativeCirclePacking(n) {

  return true;
}

iterativeCirclePacking(10);

--solutions--

function iterativeCirclePacking(n) {
  let k1 = 1;
  let k0 = k1 * (3 - 2 * Math.sqrt(3));
  let a0 = 1 / (k0 * k0);
  let a1 = 3 / (k1 * k1);
  a1 += 3 * getArea(k0, k1, k1, n);
  a1 += getArea(k1, k1, k1, n);
  let final = ((a0 - a1) / a0).toFixed(8);
  
  return parseFloat(final);
  function getArea(k1, k2, k3, depth) {
      if (depth == 0) return 0.0;
      let k4 = k1 + k2 + k3 + 2 * Math.sqrt(k1 * k2 + k2 * k3 + k3 * k1);
      let a = 1 / (k4 * k4);
      a += getArea(k1, k2, k4, depth - 1);
      a += getArea(k2, k3, k4, depth - 1);
      a += getArea(k3, k1, k4, depth - 1);
      return a;
  }
}