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

# jpleboeuf's solution

## to Difference Of Squares in the Nim Track

Published at Sep 21 2020 · 0 comments
Instructions
Test suite
Solution

#### Note:

This exercise has changed since this solution was written.

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.

## Running the tests

To compile and run the tests, just run the following in your exercise directory:

``````\$ nim c -r difference_of_squares_test.nim
``````

## Submitting Exercises

Note that, when trying to submit an exercise, make sure the solution is in the `\$EXERCISM_WORKSPACE/nim/difference-of-squares` directory.

You can find your Exercism workspace by running `exercism debug` and looking for the line that starts with `Exercises Directory`.

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

``````import unittest
import difference_of_squares

# version 1.2.0

suite "Difference of Squares":
test "square of sum 1":
check squareOfSum(1) == 1

test "square of sum 5":
check squareOfSum(5) == 225

test "square of sum 100":
check squareOfSum(100) == 25_502_500

test "sum of squares 1":
check sumOfSquares(1) == 1

test "sum of squares 5":
check sumOfSquares(5) == 55

test "sum of squares 100":
check sumOfSquares(100) == 338_350

test "difference of squares 1":
check difference(1) == 0

test "difference of squares 5":
check difference(5) == 170

test "difference of squares 100":
check difference(100) == 25_164_150``````
``````from math import `^`, sum
from sequtils import toSeq, mapIt

template raiseValueError(): untyped =
raise newException(ValueError, "n has to be a natural number")

func squareOfSum*(n: uint): uint =
if n < 1: raiseValueError
(sum toSeq(uint(1)..n)) ^ uint(2)

func sumOfSquares*(n: uint): uint =
if n < 1: raiseValueError
sum toSeq(uint(1)..n).mapIt(it ^ uint(2))

func difference*(n: uint): uint =
if n < 1: raiseValueError
squareOfSum(n) - sumOfSquares(n)``````