Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

Out of 20 test, 17 finish succesfully (pass) and 3 fail. The error I get is: “When the user enters “1530051126,10”, you should see the message Valid ISBN Code. in the console.”
As far as i can tell the problem is the “calculate_check_digit_10” func returns “0” instead if “6” for the testcase above.
Please tell me what is wrong with this code.

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]
    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
    print('expected_check_digit',expected_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:
        values = user_input.split(',')
        isbn = values[0]
        if not bool(re.fullmatch(r'\d+',isbn)):
            print ("Invalid character was found.")
            return 1   
        length = int(values[1])
    except IndexError:
        print('Enter comma-separated values.')
    except ValueError:
        print('Length must be a number.')
    
    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 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.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

do you think that you should use the check digit to calculate the check digit?

or, separately, is the check digit part of the main digits?

Yes, here is what the description says:

How to find the check digit:

  • You don’t have to know the detailed calculation logic in this lab. The functions calculate_check_digit_10 and calculate_check_digit_13 will take care of the calculation and return the expected check digit in string.
  • The check digit for ISBN-10 codes can be a number from 0 to 9 or an uppercase letter X.
  • The check digit for ISBN-13 codes can be a number from 0 to 9.

yes, that says to use those functions to calculate the check digit

what are you passing to those functions, tho? that’s the important thing to figure out

the comment here says # Calculate the check digit from other digits, so that seams that the check digit should not be part of “other digits”, isn’t it?

note also the comments # Multiply each of the first 9 digits and # Multiply each of the first 12, how may digits are the functions expecting?

ok, I get what you’re saying

it was supposed to be

main_digits = isbn[0:length-1]

now all the tests pass. thanks for your help :wink: