Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

Hi,

tests 8,12,13,14,17 seem to fail. I have tested those patterns in a python ide and pass correctly. Please advice.

Thank you

Your code so far

import sys

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-1]
    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: ')
    try:
        if "," not in user_input:
           raise IndexError("Enter comma-separated values.")

        values = user_input.split(',')
        isbn = str(values[0]).strip()
        length = int(values[1].strip())
        if len(isbn) != length and (length == 10 or length == 13):
            raise ValueError(f"ISBN-{length} code should be {length} digits long.")
        last_digit = isbn[length-1]
        isbn_ok = isbn[0:length-1].isdigit()
        last_digit_ok = (last_digit == "X") or (last_digit.isdigit())

        if not isbn_ok or not last_digit_ok:
            raise ValueError("Invalid character was found.")

    except IndexError as csv:
        print(csv)
        sys.exit(0)
    except ValueError as e:
        if "invalid literal for int()" in str(e):
            print("Length must be a number.")
            sys.exit(0)
        else:
            print(e)
            sys.exit(0)

    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/143.0.0.0 Safari/537.36 Edg/143.0.0.0

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

try with 9781530051120 as input, it errors out

it seems you are aslo stopping the tests

in Pycharm:

Enter ISBN and length: 9781530051120
Enter comma-separated values.

Process finished with exit code 0

is there any way to run it (providing input) inside the lab’s page ?

comment out the main() at the bottom, and write the input in the terminal on the right

the tests are also Python code, if you stop everything with sys.exit(0), how could they check if you are doing right?

instead, exit only the function, not the whole program