Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

Can someone please tell me what in the world I need to do to get past 19? When I test it with no quotes, I get a SyntaxError because python doesn’t allow leading zeros for decimal integers, and when I use quotes it says ‘Valid ISBN Code’ but the test case doesn’t pass. I’ve gone through a lot of the solutions on the forum and none of them seem to help, most were just generic responses.

Your code so far

def validate_isbn(isbn, length):
    if len(str(isbn)) != length:
        print(f'ISBN-{length} code should be {length} digits long.')
        return
    main_digits = str(isbn)[0:length-1]
    given_check_digit = str(isbn)[length-1]
    main_digits_list = [int(digit) for digit in main_digits]
    # print(main_digits_list)
    # print(given_check_digit)
    # 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 = int(values[0])
    except ValueError:
        print('Invalid character was found.')
        return
    try:
        length = int(values[1])
    except ValueError:
        print('Length must be a number.')
        return
    if length == 10 or length == 13:
        validate_isbn(isbn, length)
    else:
        print('Length should be 10 or 13.')
        return

# main()
# validate_isbn(1530051126,10)
validate_isbn(080442957X,10)

Your browser information:

User Agent is: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

GitHub Link: freeCodeCamp/curriculum/challenges/english/blocks/lab-isbn-validator/686b9720ee1d032bd77a480a.md at main · freeCodeCamp/freeCodeCamp · GitHub

Welcome back @albasfaisal,

Looking at these instructions:

Example inputs for valid ISBN-10 codes: 1530051126,10 9971502100,10 080442957X,10

  • The check digit for ISBN-10 codes can be a number from 0 to 9 or an uppercase letter X.

Can ISBN be type int?

Happy coding

It should be, given the instruction in user story 10:

  1. When the user enters an incorrect ISBN code with characters other than numbers, they should see the message Invalid character was found. in the console.

or am I missing something?

That user story is misleading since the ISBN obviously can contain an ‘X’ based on the instructions I referenced. But the ‘X’ can only be the check digit if the length is 10.

But doesn’t that mean having to choose either constantly failing test 14 or 19 given the contradiction between the description and the user story? I’m really confused here.

You will not fail those tests if you validate the ISBN correctly based on its length. If it’s 10 characters long, it can contain an integer or an ‘X’ as the last digit. If it’s 13 characters long, it must be all integers.