Created
May 18, 2022 02:50
-
-
Save dasunsucharith/d7d423e4ad3cb777f545a81e43256543 to your computer and use it in GitHub Desktop.
CS50 2022 psets6 credit problem solution
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# TODO | |
import sys | |
def main(): | |
# Get card number from the user | |
credit_card_number = get_credit_card_number() | |
# validate the card provided by the user | |
validate_card(credit_card_number) | |
# execute until user input a valid credit card number | |
def get_credit_card_number(): | |
# prompt user for card number | |
while True: | |
card_number = input("Number: ") | |
# calculate card length | |
try: | |
if len(card_number) > 0 and int(card_number): | |
break | |
except ValueError: | |
continue | |
return card_number | |
# validate the user input creadit card number | |
def validate_card(credit_card_number): | |
if len(credit_card_number) < 13 or 16 < len(credit_card_number): | |
print("INVALID") | |
sys.exit(0) | |
even_number, odd_number = 0, 0 | |
card_number_length = len(credit_card_number) | |
# Calculates sum according to Luhn's Algorithm | |
if card_number_length % 2 == 0: | |
for numbers in range(card_number_length): | |
number = int(credit_card_number[numbers]) | |
if numbers % 2 == 0: | |
multiple = number * 2 | |
if multiple >= 10: | |
even_number += multiple // 10 | |
even_number += multiple % 10 | |
else: | |
even_number += multiple | |
else: | |
odd_number += number | |
else: | |
for numbers in range(card_number_length): | |
number = int(credit_card_number[numbers]) | |
if numbers % 2 != 0: | |
multiple = number * 2 | |
if multiple >= 10: | |
even_number += multiple // 10 | |
even_number += multiple % 10 | |
else: | |
even_number += multiple | |
else: | |
odd_number += number | |
checksum = (even_number + odd_number) % 10 | |
# Check for conditions of all companies | |
if checksum == 0: | |
first_digit = int(credit_card_number[0]) | |
second_digit = int(credit_card_number[1]) | |
if first_digit == 3 and second_digit == 4 or second_digit == 7: | |
print("AMEX") | |
elif first_digit == 5 and 1 <= second_digit <= 5: | |
print("MASTERCARD") | |
elif first_digit == 4: | |
print("VISA") | |
else: | |
print("INVALID") | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment