Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

Hi, I have been struggling with this one since end of last week. Getting lost. Tests 9-13 and 18-20 do not pass. Can you please put me on the right track? I have not changed anything in the check digit functions.

Your code so far

import re

def validate_isbn(isbn, length):
    if len(isbn, length) != length:
        print(f'ISBN-{length} code should be {length} digits long.')
        return
    main_digits = isbn[0:length]
    given_check_digit = isbn[length-1]
    if re.fullmatch(r'\d{9}X',main_digits):
        main_digits_list = [int(digit) for digit in main_digits[:-1]]
    else:
        main_digits_list = [int(digit) for digit in main_digits]

    # Calculate the check digit from other digits
    if length == 10:
        expected_check_digit = calculate_check_digit_10(main_digits_list)
    else:
        expected_check_digit = calculate_check_digit_13(main_digits_list)
    # Check if the given check digit matches with the calculated check digit
    if given_check_digit == expected_check_digit:
        print('Valid ISBN Code.')
    else:
        print('Invalid ISBN Code.')

def calculate_check_digit_10(main_digits_list):
    # Note: You don't have to fully understand the logic in this function.
    digits_sum = 0
    # Multiply each of the first 9 digits by its corresponding weight (10 to 2) and sum up the results
    for index, digit in enumerate(main_digits_list):
        digits_sum += digit * (10 - index)
    # Find the remainder of dividing the sum by 11, then subtract it from 11
    result = 11 - digits_sum % 11
    # The calculation result can range from 1 to 11.
    # If the result is 11, use 0.
    # If the result is 10, use upper case X.
    # Use the value as it is for other numbers.
    if result == 11:
        expected_check_digit = '0'
    elif result == 10:
        expected_check_digit = 'X'
    else:
        expected_check_digit = str(result)
    return expected_check_digit

def calculate_check_digit_13(main_digits_list):
    # Note: You don't have to fully understand the logic in this function.
    digits_sum = 0
    # Multiply each of the first 12 digits by 1 and 3 alternately (starting with 1), and sum up the results
    for index, digit in enumerate(main_digits_list):
        if index % 2 == 0:
            digits_sum += digit * 1
        else:
            digits_sum += digit * 3
    # Find the remainder of dividing the sum by 10, then subtract it from 10
    result = 10 - digits_sum % 10
    # The calculation result can range from 1 to 10.
    # If the result is 10, use 0.
    # Use the value as it is for other numbers.
    if result == 10:
        expected_check_digit = '0'
    else:
        expected_check_digit = str(result)
    return expected_check_digit

def main():
    try:
        user_input = input('Enter ISBN and length: ')
        if ',' not in user_input:
            print("Enter comma-separated values.")
            return
        values = user_input.split(',')
        isbn = values[0]
        length = int(values[1])
        if not re.fullmatch(r'\d{9}X|\d{10}|\d{13}',isbn):
            print('Invalid character was found.')
            return
        if length == 10 or length == 13:
            validate_isbn(isbn, length)
        else:
            print('Length should be 10 or 13.')

    except ValueError as ve:
        print('Length must be a number.')
        return
        
main()

Your browser information:

User Agent is: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3.1 Safari/605.1.15

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

Here are some debugging steps you can follow. Focus on one test at a time:

  1. Are there any errors or messages in the console?
  2. What is the requirement of the failing test?
  3. Check the related User Story and ensure it’s followed precisely.
  4. What line of code implements this?
  5. What is the result of the code and does it match the requirement? (Write the value of a variable to the console at that point in the code if needed.)

If this does not help you solve the problem, please reply with answers to these questions.

  1. The len() function takes only one argument, so check this line:
if len(isbn, length) != length:
  1. You’re supposed to ommit the check digit (last digit):
# Before
main_digits = isbn[0:length]
removed

Hope this helps ┌( ͝° ͜ʖ͡°).

It is great that you solved the challenge, but instead of posting your full working solution, it is best to stay focused on answering the original poster’s question(s) and help guide them with hints and suggestions to solve their own issues with the challenge. How to Help Someone with Their Code Using the Socratic Method

We are trying to cut back on the number of spoiler solutions found on the forum and instead focus on helping other campers with their questions and definitely not posting full working solutions.

Thanks, that was helpful. So I corrected the ten function with only isbn, and corrected main_digits = isbn[0:length-1] to exclude the check digit. Now I pass all tests, but strangely, #1 ( You should comment out the call to the main function to allow for the rest of the tests to work properly.) does not pass. I guess it must be simple, but I do not see what I should do at this stage. Or maybe I do not understand what is required exactly under #1?

Sorry, in the first line of my comment, I meant “I corrected the ‘len’ function”.

Got it. Completed the assignment.

There is still an issue I want to check with you. I passed all tests and succeeded but when I test for myself for #20 (9781947172104,13), I see in the console: takes 0 positional arguments but 2 were given. I do not get it.

Please post your updated code if you need more help.

try running your code with https://pythontutor.com/ so you see exactly which line is creating the error