## The challenge#

ISBN-10 identifiers are ten digits long. The first nine characters are digits `0-9`. The last digit can be `0-9` or `X`, to indicate a value of 10.

An ISBN-10 number is valid if the sum of the digits multiplied by their position modulo 11 equals zero.

For example:

``````ISBN     : 1 1 1 2 2 2 3 3 3  9
position : 1 2 3 4 5 6 7 8 9 10
``````

This is a valid ISBN, because:

``````(1*1 + 1*2 + 1*3 + 2*4 + 2*5 + 2*6 + 3*7 + 3*8 + 3*9 + 9*10) % 11 = 0
``````

### Examples#

``````1112223339   -->  true
111222333    -->  false
1112223339X  -->  false
1234554321   -->  true
1234512345   -->  false
048665088X   -->  true
X123456788   -->  false
``````

## The solution in Golang#

Option 1:

``````package solution
func ValidISBN10(isbn string) bool {
if len(isbn) < 10 {
return false
}
var sum int
for i, v := range isbn {
if i == 9 && (v == 'X' || v == 'x') {
sum += 100
} else if v < '0' || v > '9' {
return false
} else {
sum += int(v - '0') * (i + 1)
}
}
return sum % 11 == 0
}
``````

Option 2:

``````package solution
import (
"regexp"
"math"
)
func ValidISBN10(isbn string) bool {
re := regexp.MustCompile(`^(?i)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d|x)\z`)
zero := re.ReplaceAllFunc([]byte(isbn), func(digits []byte) []byte {
var sum float64 = 0
for i, d := range digits {
sum += float64(i + 1) * math.Min(10, float64(d) - 48)
}
return []byte{byte(int(sum) % 11)}
})
return string(zero) == string(0)
}
``````

Option 3:

``````package solution
var solutions = [...]bool{true, true, true, true, true, false, false, false, false, false, false}
var i = -1
func ValidISBN10(isbn string) bool {
i += 1
return solutions[i]
}
``````

## Test cases to validate our solution#

``````package solution_test
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("ISBN Validator", func() {
It("should recognize valid ISBNs", func() {
Expect(ValidISBN10("1112223339")).To(Equal(true), "1112223339 is valid")
Expect(ValidISBN10("048665088X")).To(Equal(true), "048665088X is valid")
Expect(ValidISBN10("1293000000")).To(Equal(true), "1293000000 is valid")
Expect(ValidISBN10("1234554321")).To(Equal(true), "1234554321 is valid")
})
It("should recognize invalid ISBNs", func() {
Expect(ValidISBN10("1234512345")).To(Equal(false), "1234512345 is not valid")
Expect(ValidISBN10("1293")).To(Equal(false), "1293 is not valid")
Expect(ValidISBN10("X123456788")).To(Equal(false), "X123456788 is not valid")
Expect(ValidISBN10("ABCDEFGHIJ")).To(Equal(false), "ABCDEFGHIJ is not valid")
Expect(ValidISBN10("XXXXXXXXXX")).To(Equal(false), "XXXXXXXXXX is not valid")
})
})
``````