## The challenge#

An array is circularly sorted if the elements are sorted in ascending order but displaced, or rotated, by any number of steps.

Complete the function/method that determines if the given array of integers is circularly sorted.

Examples:

These arrays are circularly sorted (`true`):

``````[2, 3, 4, 5, 0, 1]       -->  [0, 1] + [2, 3, 4, 5]
[4, 5, 6, 9, 1]          -->  [1] + [4, 5, 6, 9]
[10, 11, 6, 7, 9]        -->  [6, 7, 9] + [10, 11]
[1, 2, 3, 4, 5]          -->  [1, 2, 3, 4, 5]
[5, 7, 43, 987, -9, 0]   -->  [-9, 0] + [5, 7, 43, 987]
[1, 2, 3, 4, 1]          -->  [1] + [1, 2, 3, 4]
``````

While these are not (`false`):

``````[4, 1, 2, 5]
[8, 7, 6, 5, 4, 3]
[6, 7, 4, 8]
[7, 6, 5, 4, 3, 2, 1]
``````

## The solution in Golang#

Option 1:

``````package solution
func IsCircleSorted(r []int) bool {
downs := 0
for i:= 0; i<len(r); i ++ {
if r[i] > r[(i+1)%len(r)] {
downs += 1}
}
return downs <= 1
}
``````

Option 2:

``````package solution
import "sort"
func IsCircleSorted(r []int) bool {
q := make([]int, len(r))
for i := 0; i < len(r); i++ {
for j := 0; j < len(r); j++ {
q[j] = r[(j+i)%len(r)]
}
if sort.IntsAreSorted(q) {
return true
}
}
return len(r) == 0
}
``````

Option 3:

``````package solution
func IsCircleSorted(r []int) bool {
if len(r) == 0 {
return true
}
decreaseCount := 0
for i := 1; i < len(r); i++ {
if r[i-1] > r[i] {
decreaseCount++
}
}
if r[len(r)-1] > r[0] {
decreaseCount++
}
return decreaseCount <= 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("Test 1",func() {Expect(IsCircleSorted([]int{2,3,4,5,6})).To(Equal(true))})
It("Test 2",func() {Expect(IsCircleSorted([]int{6,2,3,4,5})).To(Equal(true))})
It("Test 3",func() {Expect(IsCircleSorted([]int{3,2,4,5,6})).To(Equal(false))})
})
``````