Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

I am facing currently issues with Step 9 (It should show “Valid ISBN Code.” for 1530051126,10 but I am getting “Invalid ISBN Code.” As my output). Similarly, it does not pass the test for Step 19 (It should show “Valid ISBN Code.” for 080442957X,10) and Step 20 (It should show “Valid ISBN Code.” for 9781947172104,13). Can someone help me out here? Maybe hints for where I am going wrong and if you have any suggestions, I would highly appreciate it.

Your code so far

def validate_isbn(isbn, length):
    if len(isbn) != length:
        print(f'ISBN-{length} code should be {length} digits long.')
        return
    main_digits = isbn[0:length]
    given_check_digit = isbn[length-1]
    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():
    user_input = input('Enter ISBN and length: ')
    if ',' not in user_input:
        print('Enter comma-separated values.')
        return
    values = user_input.split(',')
    try:
        isbn = values[0]
        length = int(values[1])
    except ValueError:
        print("Length must be a number.")
    for dig in isbn:
        if (dig < '0') or (dig > '9'):
            print ('Invalid character was found.')
            return
    if length == 10 or length == 13:
        validate_isbn(isbn, length)
    else:
        print('Length should be 10 or 13.')

main()

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

maybe put your code in a tool like https://pythontutor.com/ so you can see it executed line by line and you can see at what point of the code the issue happens

I see that the given_check_digit does not match the expected_check_digit value. My question is how do we determine the given_check_digit? It has to be 0 or X. X scenario I think I get it but how to do it for 0 case?

the comment says this, about where to use O or X for ISBN10

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.