ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# tonyq's solution

## to Difference Of Squares in the TypeScript Track

Published at Aug 30 2020 · 0 comments
Instructions
Test suite
Solution

Find the difference between the square of the sum and the sum of the squares of the first N natural numbers.

The square of the sum of the first ten natural numbers is (1 + 2 + ... + 10)Â² = 55Â² = 3025.

The sum of the squares of the first ten natural numbers is 1Â² + 2Â² + ... + 10Â² = 385.

Hence the difference between the square of the sum of the first ten natural numbers and the sum of the squares of the first ten natural numbers is 3025 - 385 = 2640.

You are not expected to discover an efficient solution to this yourself from first principles; research is allowed, indeed, encouraged. Finding the best algorithm for the problem is a key skill in software engineering.

## Setup

Go through the setup instructions for TypeScript to install the necessary dependencies:

https://exercism.io/tracks/typescript/installation

## Requirements

Install assignment dependencies:

``````\$ yarn install
``````

## Making the test suite pass

Execute the tests with:

``````\$ yarn test
``````

In the test suites all tests but the first have been skipped.

Once you get a test passing, you can enable the next one by changing `xit` to `it`.

## Source

Problem 6 at Project Euler http://projecteuler.net/problem=6

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### difference-of-squares.test.ts

``````import Squares from './difference-of-squares'

describe('Squares', () => {

describe('up to 5', () => {
const squares = new Squares(5)

it('gets the square of sum', () => {
expect(squares.squareOfSum).toBe(225)
})

xit('gets the sum of squares', () => {
expect(squares.sumOfSquares).toBe(55)
})

xit('gets the difference', () => {
expect(squares.difference).toBe(170)
})

})

describe('up to 10', () => {
const squares = new Squares(10)

xit('gets the square of sum', () => {
expect(squares.squareOfSum).toBe(3025)
})

xit('gets the sum of squares', () => {
expect(squares.sumOfSquares).toBe(385)
})

xit('gets the difference', () => {
expect(squares.difference).toBe(2640)
})

})

describe('up to 100', () => {
const squares = new Squares(100)

xit('gets the square of sum', () => {
expect(squares.squareOfSum).toBe(25502500)
})

xit('gets the sum of squares', () => {
expect(squares.sumOfSquares).toBe(338350)
})

xit('gets the difference', () => {
expect(squares.difference).toBe(25164150)
})

})

})``````
``````class Squares {
public num: number;
public squareOfSum: number;
public sumOfSquares: number;
public difference: number;

constructor(num: number){
this.num = num;
this.squareOfSum = this.getSquareOfSum(num);
this.sumOfSquares = this.getSumOfSquares(num);
this.difference = this.squareOfSum - this.sumOfSquares;
}

getSquareOfSum(x: number, acc: number = 0): number {
return x === 0 ? acc ** 2 : this.getSquareOfSum(x - 1, x + acc);
}

getSumOfSquares(x: number, acc: number = 0): number {
return x === 0 ? acc : this.getSumOfSquares(x - 1, (x ** 2) + acc);
}

}

export default Squares;``````