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

# Jame's solution

## to Difference Of Squares in the Vim script Track

Published at Aug 21 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.

# How to run the tests

If you don't know how to run Vader tests, see: Tests.

For general information about the Vim script track, see: Help.

## 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.

``````"
" Version: 1.2.0
"

Execute (square of sum 1):
let number = 1
let expected = 1
AssertEqual expected, SquareOfSum(number)

Execute (square of sum 5):
let number = 5
let expected = 225
AssertEqual expected, SquareOfSum(number)

Execute (square of sum 100):
let number = 100
let expected = 25502500
AssertEqual expected, SquareOfSum(number)
Execute (sum of squares 1):
let number = 1
let expected = 1
AssertEqual expected, SumOfSquares(number)

Execute (sum of squares 5):
let number = 5
let expected = 55
AssertEqual expected, SumOfSquares(number)

Execute (sum of squares 100):
let number = 100
let expected = 338350
AssertEqual expected, SumOfSquares(number)
Execute (difference of squares 1):
let number = 1
let expected = 0
AssertEqual expected, DifferenceOfSquares(number)

Execute (difference of squares 5):
let number = 5
let expected = 170
AssertEqual expected, DifferenceOfSquares(number)

Execute (difference of squares 100):
let number = 100
let expected = 25164150
AssertEqual expected, DifferenceOfSquares(number)``````
``````"after about 2 hours of deriving formulas while cooking food for tonight I
" got to polynomials that represent each of these functions.
" I realize the point of the assignment is more to use research to speed up
" coding practices, but I found my approach to be more incandescent since I
" love mathematics
"
" it was a little annnoying that float2nr had to be called on each res so I
" contemplated using a custom integral-iterative pow function, but that felt
" extremely wasteful.  this is fine
"
function! DifferenceOfSquares(number) abort
return float2nr({ n -> (3*pow(n,4)+2*pow(n,3)-3*pow(n,2)-2*n)/12 }(a:number))
endfunction

function! SquareOfSum(number) abort
return float2nr({ n -> (pow(n,4)+2*pow(n,3)+pow(n,2))/4 }(a:number))
endfunction

function! SumOfSquares(number) abort
return float2nr({ n -> (2*pow(n,3)+3*pow(n,2)+n)/6 }(a:number))
endfunction``````