Skip to content

Instantly share code, notes, and snippets.

@billdueber
Last active April 14, 2024 04:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save billdueber/4ecd64042de82543f56545fbe7423ab8 to your computer and use it in GitHub Desktop.
Save billdueber/4ecd64042de82543f56545fbe7423ab8 to your computer and use it in GitHub Desktop.

Summarize the algorithm described between START and STOP

START

This is the process:

  1. Take the first 12 digits of the 13-digit ISBN

  2. Multiply each number in turn, from left to right by a number. The first digit is multiplied by 1, the second by 3, the third by 1 again, the fourth by 3 again, and so on to the eleventh which is multiplied by 1 and the twelfth by 3.

  3. Add all of the 12 answers.

  4. Do a modulo 10 division on the result from step 3.

  5. Take that remainder result from step 4.If it’s a zero, then the check digit is zero. If the remainders isn’t zero then subtract the remainder from 10. The answer to that is your check digit.

STOP


The algorithm described involves taking the first 12 digits of an 13-digit ISBN, multiplying each number in turn by a specific number (1 for odd numbers and 3 for even numbers), adding up the products, performing a modulo 10 division on the result, and then using the remainder as the check digit if it is zero or subtracting the remainder from 10 to obtain the check digit. The algorithm is simple and straightforward, but may not be the most efficient way to calculate the checksum.


Provide idiomatic ruby code that implements the algorithm


Here is some Ruby code that implements the ISBN-13 checksum algorithm described earlier:

def isbn_checksum(isbn)
  sum = 0
  12.times do |i|
    if i % 2 == 0
      sum += isbn[i].to_i
    else
      sum += (3 * isbn[i].to_i)
    end
  end
  remainder = sum % 10
  checksum = (remainder == 0) ? 0 : 10 - remainder
end

This code uses the times method to iterate over the first 12 digits of the ISBN, and then checks whether the current iteration is even or odd. If it’s even, the digit is multiplied by 3 and added to the sum, otherwise it’s added to the sum without modification. The to_i method is used to convert each character in the ISBN string to an integer.

After iterating over all 12 digits, the remainder of the sum modulo 10 is calculated. If this remainder is zero, the checksum is set to 0, otherwise it’s subtracted from 10 to obtain the actual checksum. The isbn_checksum function returns the checksum as an integer


Rewrite the code to be more efficient


Here is a more efficient version of the Ruby code that implements the ISBN-13 checksum algorithm:

def isbn_checksum(isbn)
  sum = 0
  12.times do |i|
    sum += (i % 2 == 0 ? isbn[i].to_i : 3 * isbn[i].to_i)
  end
  remainder = sum % 10
  checksum = (remainder == 0) ? 0 : 10 - remainder
end

This version of the code uses a more concise syntax for iterating over the first 12 digits of the ISBN, and it also avoids unnecessary conversions to integers. The to_i method is only used once in this version of the code, and it’s used to convert the character at each iteration to an integer before performing any arithmetic operations on it.

Overall, this version of the code is more efficient because it uses a more concise syntax for iterating over the digits of the ISBN, and it avoids unnecessary conversions to integers.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment