Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

// running tests
9. When the user enters 1530051126,10, you should see the message Valid ISBN Code. in the console.
20. When the user enters 9781947172104,13, you should see the message Valid ISBN Code..
// tests completed

those two tests don’t pass and i didn’t change any thing in calculate_check_digit_13 and calculate_check_digit_10 functions.

Your code so far

import re
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]
    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])
        #print(not isbn[-1] in [str(n) for n in range(0,10)]+['x'])
        #print(isbn[-1])
        #print([str(n) for n in range(0,10)]+['x'])
        #if not isbn[-1] in [str(n) for n in range(0,10)]+['x']:
        #print(re.fullmatch('\\d{10}',isbn))
        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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Edg/144.0.0.0

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

try:
    # Code that might raise any non-fatal exception
except Exception as e:
    print(f"An unexpected error occurred: {e}")

try adding code like this in validate_isbn. should catch all errors.

import re
def validate_isbn(isbn, length):
    try:
        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]
        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.')
    except Exception as e:
        print(f"An error occured: {e}")
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])
        #print(not isbn[-1] in [str(n) for n in range(0,10)]+['x'])
        #print(isbn[-1])
        #print([str(n) for n in range(0,10)]+['x'])
        #if not isbn[-1] in [str(n) for n in range(0,10)]+['x']:
        #print(re.fullmatch('\\d{10}',isbn))
        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() 

I tried it but itdoes’nt working

I didn’t get any error, but i got “Invalid ISBN Code.” with codes 1530051126,10 and 9781947172104,13 instead of Valid ISBN Code.

Thanks in advance.

I solved it.

The problem was in

main_digits_list = [int(digit) for digit in main_digits]

It must be:

main_digits_list = [int(digit) for digit in main_digits[:-1]]

Thanks

1 Like