110 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						|
id: 5900f3c11000cf542c50fed4
 | 
						|
title: 'Problem 85: Counting rectangles'
 | 
						|
challengeType: 5
 | 
						|
forumTopicId: 302199
 | 
						|
dashedName: problem-85-counting-rectangles
 | 
						|
---
 | 
						|
 | 
						|
# --description--
 | 
						|
 | 
						|
By counting carefully it can be seen that a rectangular grid measuring 3 by 2 contains eighteen rectangles:
 | 
						|
 | 
						|
<img class="img-responsive center-block" alt="a diagram of the different rectangles found within a 3 by 2 rectangular grid" src="https://cdn-media-1.freecodecamp.org/project-euler/counting-rectangles.png" style="background-color: white; padding: 10px;" />
 | 
						|
 | 
						|
Although there may not exists a rectangular grid that contains exactly `n` rectangles, find the area of the grid with the nearest solution.
 | 
						|
 | 
						|
# --hints--
 | 
						|
 | 
						|
`countingRectangles(18)` should return a number.
 | 
						|
 | 
						|
```js
 | 
						|
assert(typeof countingRectangles(18) === 'number');
 | 
						|
```
 | 
						|
 | 
						|
`countingRectangles(18)` should return `6`.
 | 
						|
 | 
						|
```js
 | 
						|
assert.strictEqual(countingRectangles(18), 6);
 | 
						|
```
 | 
						|
 | 
						|
`countingRectangles(250)` should return `22`.
 | 
						|
 | 
						|
```js
 | 
						|
assert.strictEqual(countingRectangles(250), 22);
 | 
						|
```
 | 
						|
 | 
						|
`countingRectangles(50000)` should return `364`.
 | 
						|
 | 
						|
```js
 | 
						|
assert.strictEqual(countingRectangles(50000), 364);
 | 
						|
```
 | 
						|
 | 
						|
`countingRectangles(1000000)` should return `1632`.
 | 
						|
 | 
						|
```js
 | 
						|
assert.strictEqual(countingRectangles(1000000), 1632);
 | 
						|
```
 | 
						|
 | 
						|
`countingRectangles(2000000)` should return `2772`.
 | 
						|
 | 
						|
```js
 | 
						|
assert.strictEqual(countingRectangles(2000000), 2772);
 | 
						|
```
 | 
						|
 | 
						|
# --seed--
 | 
						|
 | 
						|
## --seed-contents--
 | 
						|
 | 
						|
```js
 | 
						|
function countingRectangles(n) {
 | 
						|
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
countingRectangles(18);
 | 
						|
```
 | 
						|
 | 
						|
# --solutions--
 | 
						|
 | 
						|
```js
 | 
						|
function countingRectangles(n) {
 | 
						|
  function numberOfRectangles(h, w) {
 | 
						|
    return (h * (h + 1) * w * (w + 1)) / 4;
 | 
						|
  }
 | 
						|
 | 
						|
  function rectangleArea(h, w) {
 | 
						|
    return h * w;
 | 
						|
  }
 | 
						|
 | 
						|
  let rectanglesCount = 1;
 | 
						|
  let maxSide = 1;
 | 
						|
  while (rectanglesCount < n) {
 | 
						|
    maxSide++;
 | 
						|
    rectanglesCount = numberOfRectangles(maxSide, 1);
 | 
						|
  }
 | 
						|
 | 
						|
  let bestDiff = Math.abs(rectanglesCount - n);
 | 
						|
  let bestSize = [maxSide, 1];
 | 
						|
 | 
						|
  let curHeight = maxSide - 1;
 | 
						|
  let curWidth = 1;
 | 
						|
 | 
						|
  for (curWidth; curWidth < curHeight; curWidth++) {
 | 
						|
    for (curHeight; curHeight > curWidth; curHeight--) {
 | 
						|
      rectanglesCount = numberOfRectangles(curHeight, curWidth);
 | 
						|
      const curDiff = Math.abs(rectanglesCount - n);
 | 
						|
      if (curDiff < bestDiff) {
 | 
						|
        bestDiff = curDiff;
 | 
						|
        bestSize = [curHeight, curWidth];
 | 
						|
      }
 | 
						|
 | 
						|
      if (rectanglesCount < n) {
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return rectangleArea(...bestSize);
 | 
						|
}
 | 
						|
```
 |