Python алгоритм мошенничества с кредитными картами - PullRequest
1 голос
/ 21 июня 2020

Подсказка: реализация функции, которая определяет, действителен ли номер карты, в соответствии с некоторыми простыми алгоритмами. Предположим, что номер кредитной карты представляет собой строку из 14 символов в формате #### - #### - ####, включая тире, где '#' представляет собой цифру от 0 до 9, поэтому что всего 12 цифр.

Цель: реализовать функцию под названием «verify», которая принимает единственный параметр с именем «number», а затем проверяет следующие правила:

  1. Первый di git должно быть 4.
  2. Четвертый di git должен быть на единицу больше пятой цифры; имейте в виду, что они разделены da sh, поскольку формат следующий: #### - #### - ####.
  3. Сумма всех цифр должна делиться на 4 без остатка.
  4. Если вы обрабатываете первые две цифры как два-ди git число, а седьмую и восьмую цифры как два-ди git число, их сумма должна быть 100.

Если условия не выполняются, верните «правило № X» в зависимости от того, какое правило было неудачным.

Мой прогресс:

def verify(number):
    if len(number) != 14:
        return False
    if number[0] != 4:
        print("rule#1")
    if number[5] + 1 != number[3]:
        print("rule#2")
    if sum(number) != int:
        print("rule#3")
    if number[0,1] + number[6,7] != 100
        print("rule#4")

    return True # 

input = "5000-0000-0000" 
output = verify(input) 
print(output) 

Я думаю, у меня проблемы с третьим и четвертое условие, но не знаю, что делать / как подойти к нему.

Ответы [ 3 ]

0 голосов
/ 21 июня 2020

Вы должны return строки вместо печати. Для третьего правила вы можете использовать функцию по модулю %. Вот один из способов сделать это (четвертое правило почти наверняка можно улучшить ...)

def verify(number):
    if len(number) != 14 or int(number[0]) != 4:
        return False
    if int(number[0]) != 4:
        return "rule#1"
    if int(number[5]) + 1 != int(number[3]):
        return "rule#2"
    if sum(int(num) for num in number.replace("-","")) % 4 != 0:
        return "rule#3"
    if int(str(number[0] + str(number[1]))) + int(str(number[6] + str(number[7]))) != 100:
        return "rule#4"
    return True

input = "4501-0550-0000"
output = verify(input)
print(output)
0 голосов
/ 21 июня 2020

вы можете попробовать это:

import re
def verify(number):
    try:
        ## remove any spaces in begginng and end
        number = number.strip()
        ## remove any spaces between numbers
        number = re.sub("\s+","",number)
        if len(number) != 14:
            return False, "current number length is "+str(len(number)) + " but number is missing the expected length of 14."
        if int(number[0]) != 4:
            return False, "First digit must be 4. but received first digit is " + number[0]
        if int(number[5]) + 1 != int(number[3]):
             return False, "The fourth digit must be one greater than the fifth digit"
        if sum([int(digit) for digit in re.sub("-","",input)]) % 4 != 0:
            return False, "Sum of all digit is not divisible by 4"
        if int(input[0:2]) +  int(input[-2:]) != 100:
            return False, "Sum of first two digit and last two digit is not 100"
        return True, "All conditions are met"
    except Exception as e:
        print(e)
        return False, "code got interrupted."
    
input = "4000-0000-0010" 
output = verify(input) 
print(output) 

вывод, к которому вы можете получить доступ, output[0] для true / false и output[1] для сообщения

0 голосов
/ 21 июня 2020

Для третьего правила вы можете сделать это следующим образом: удалите символ '-' и добавьте все цифры.

strippedNum=number.replace('-','')  # remove '-'
digits_sum = sum([int(digit) for digit in strippedNum]) # make a list with all the digits and find their sum
if sum_of_all % 4 != 0:
    print(rule#3)

А для четвертого правила вы можете получить ошибку, потому что пытаетесь объедините две строки и приравняйте их к целому числу. Вот как это должно быть,

  if int(number[0:1]) + int(number[6:7]) != 100 # Use [lower_limit:upper_limit] when extracting from a list
    print("rule#4")

Вот так должен выглядеть ваш окончательный код (будьте осторожны при работе со строками и целыми числами)

def verify(number):
    valid = True
    if len(number) != 14:
        valid = False
if number[0] != '4':    # number[0] is a string
    print("rule#1")
    valid = False


if number[5] < number[3]:
    print("rule#2")
    valid = False


strippedNum=number.replace('-','')  # remove '-'
digits_sum = sum([int(digit) for digit in strippedNum]) # make a list with all the digits and find their sum
print(digits_sum)
if digits_sum % 4 != 0:
    print("rule#3")
    valid = False


if int(number[0:1]) + int(number[6:7]) != 100:
    print("rule#4")
    valid = False


return valid 

input = "5000-0000-0000" 
output = verify(input) 
print(output)

Этот метод распечатывает сразу все ошибки и дает логический вывод.

...