## The challenge#

In this challenge, you will be given a number `n` (`n > 0`) and your task will be to return the smallest square number `N` (`N > 0`) such that `n + N` is also a perfect square. If there is no answer, return `-1` (`nil` in Clojure, `Nothing` in Haskell, `None` in Rust).

``````solve 13 = 36
<em>; because 36 is the smallest perfect square that can be added to 13 to form a perfect square => 13 + 36 = 49</em>

solve 3 = 1 <em>; 3 + 1 = 4, a perfect square</em>
solve 12 = 4 <em>; 12 + 4 = 16, a perfect square</em>
solve 9 = 16
solve 4 = nil
``````

## The solution in Golang#

Option 1:

``````package solution
func Solve(n int) int {
res := -1
for i:= 1; i * i < n; i++ {
if n % i == 0 && (n / i - i) % 2 == 0 {
res = (n / i - i) *  (n / i - i) / 4
}
}
return res
}
``````

Option 2:

``````package solution
import "math"
func Solve(n int) int {
// n+a**2==b**2 => n=b2-a2=(a-b)(a+b) => b=(c+d)/2; a=d-b
for i := int(math.Sqrt(float64(n))); i > 0; i-- {
if n%i == 0 {
c, d := i, n/i
b := (c + d) / 2
a := d - b
if a > 0 && n+a*a == b*b { return a * a }
}
}
return -1
}
``````

Option 3:

``````package solution
import "math"
func Solve(n int) int {
upperBound := n
lowerBound := 1
for  lowerBound <= upperBound {
square := lowerBound*lowerBound
numToCheck := math.Sqrt(float64(square + n))
if math.Floor(numToCheck) == math.Ceil(numToCheck) {
return square
}
lowerBound++
}
return -1
}
``````

## Test cases to validate our solution#

``````package solution_test
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Example tests", func() {
It("It should work for basic tests", func() {
Expect(Solve(1)).To(Equal(-1))
Expect(Solve(2)).To(Equal(-1))
Expect(Solve(3)).To(Equal(1))
Expect(Solve(4)).To(Equal(-1))
Expect(Solve(5)).To(Equal(4))
Expect(Solve(7)).To(Equal(9))
Expect(Solve(8)).To(Equal(1))
Expect(Solve(9)).To(Equal(16))
Expect(Solve(10)).To(Equal(-1))
Expect(Solve(11)).To(Equal(25))
Expect(Solve(13)).To(Equal(36))
Expect(Solve(17)).To(Equal(64))
Expect(Solve(88901)).To(Equal(5428900))
Expect(Solve(290101)).To(Equal(429235524))
})
})
``````