Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

when im doing the tests manually im getting the expected result but when i do the check my code only the first 5 tests work

Your code so far

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

print(main())

Your browser information:

User Agent is: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0

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

If the first 5 tests pass but the hidden tests fail, check for edge cases. Make sure you’re handling ISBN-10 inputs with X as the check digit, validating the input length correctly, and ignoring any non-digit characters if required by the challenge. Sharing the full code concepts from removed by moderator and the failing test output would make debugging easier.

Welcome to the forum @afuna,

You have used return throughout your code where print() is expected.

As a first step, I suggest saving your code then resetting back to the original starting code, so you can see the differences around that.

Happy coding