How to Validate ISBN-10 numbers in Golang

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
Code language: JavaScript (javascript)

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 }
Code language: Go (go)

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) }
Code language: Go (go)

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] }
Code language: Go (go)

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") }) })
Code language: Go (go)
Tags:
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments