def check(S):
if len(S) != 19 and S[4] != '' and S[9] != '' and S[14] != '':
return False # checking if the format is correct
S = S.replace(" ",'') # Taking away spaces in the string
if not S.isdigit():
return False # checking that the string has only numbers
L = []
for i in S:
i = int(i) # Making a list out of the string and converting each character to an integer so that it the list can be summed
L.append(i)
if sum(L)//10 != 0: # checking to see if the sum of the list is divisible by 10
return False
import re
def cc(pat):
# check for the pattern #### #### #### #### with each '#' being a digit
m=re.match(r'(d{4})s(d{4})s(d{4})s(d{4})$', pat.strip())
if not m:
return False
# join all the digits in the 4 groups matched,
# turn into a list of ints,
# sum and
# return True/False if divisible by 10:
return sum(int(c) for c in ''.join(m.groups()))%10==0
>>> cc('9384 3495 3297 0123')
False
>>> cc('9384 3495 3297 0121')
True
def CardNumber():
global card # Making variable global for function SumCardNumDigits(); see below
card = input() # Credit card number is entered
return card
def check(S):
CardNumber = S
SplitCardNum = CardNumber.split() # Split credit card number into a list, so we get [####, ####, ####, ####]
for i in range(0, len(SplitCardNum)): # Checking if each item in list has length of four strings and each item is
# an actual a number
if len(SplitCardNum[i]) == 4 and SplitCardNum[i].isdigit():
SplitCardNum.insert(i, True) # We add to a list a True value at position i
del SplitCardNum[i + 1] # We delete items at position i + 1
return SplitCardNum
def checkFormat(SplitCardNum):
if SplitCardNum == [True] * 4: # Checking if all above conditions are met in function check(S)
# So the returned value from previous function is a list [True, True, True, True]
return True
else:
return False
def SumCardNumDigits():
Ncard = card # Using global variable 'card' from function CardNumber()
SumN = 0
for i in Ncard: # Summing up all digits in string 'Ncard', if i position in a string is empty space " "
# we skip a step.
if i == " ":
continue
else:
SumN += int(i)
return SumN
def DivideByTen(SplitCardNum):
if SplitCardNum == True: # If conditions from function check(S) are met, we divide the sum of digits
# of credit card number by 10
SumNumber = SumCardNumDigits() % 10 # We do this by using the returned value of function SumCardNumDigits()
global SumNumber # <--- Fixed code
return SumNumber
else:
return False
def IsDivideByTen(SumNumber):
check = checkFormat(SplitCardNum) # Finally we check if the sum of digits of credit card number is divisible by 10
if SumNumber == 0 and check == True: # <--- Fixed code
return True
else:
return False
print(IsDivideByTen(DivideByTen(checkFormat(check(CardNumber()))))) # Output final result
# You can test this code at: http://cscircles.cemc.uwaterloo.ca/visualize/#mode=edit and see how it works.
# Try for '9384 3495 3297 4523' and '9384 3495 3297 4526'