Проверка кредитной карты — возвращаемые значения, которые не являются жестко запрограммированными

Как мне вычислить ответ, чтобы ответ не был жестко запрограммированным решением? Например, если бы я хотел указать номер другой кредитной карты, как я могу вернуть результат этой новой кредитной карты? Кроме того, как я могу создать один список x, а не тот, который у меня есть сейчас, со значениями, разделенными на 2?

Также здесь оригинальный вопрос для справки:

Номера кредитных карт проверяются по формуле Луна 3. Реализуйте программу, которая принимает номера кредитных карт в виде многомерного массива (можно предположить, что он состоит ровно из 16 столбцов) и возвращает список со значениями Действительно. если это действительный номер карты, и Invalid в противном случае.

Один из способов выполнить проверку достоверности заключается в следующем:
1. Начиная с самой правой цифры, которая является контрольной цифрой, двигаясь влево, удваивайте значение каждой второй цифры; если произведение этой операции удвоения больше 9 (например, 8 2 = 16), то просуммируйте цифры произведений (например, 16: 1 + 6 = 7, 18: 1 + 8 = 9).
2. Возьмите сумму всех цифр.
3. Если сумма делится на 10, то число верно по формуле Луна; иначе это недействительно.

Примечание. Вы можете манипулировать номерами карт как строками (используя индексацию и нарезку для извлечения цифр и т. д.), так и целыми числами (используя целочисленное деление и остаток для манипулирования цифрами).

Мой сценарий:

    import numpy as py

    x = [[7,1],[6,3],[4,5],[6,2],[7,8],[3,4],[6,8],[3,9]] #credit card numbers
    x2 = np.array(x)
    evryothernum = x2[:,1]       #returns every other number / every seconds digit
    evryothernum2 = np.multiply(evryothernum,2)
    sumdigits = []

    def card_validate(x):
        evryothernum = x2[:,1]        #valid
        evryothernum2 = np.multiply(evryothernum,2) #multiplys         evryothernum by 2
        b=np.sort(evryothernum2, axis = None) #sorts the evryothernum2 array in order
        b2 = np.array(b)
        b3 = b2[4:8] #shows the highest values aka greater than 9 
        b3
        b3 = [1,7,7,9]
        newb3 = np.sum(b3)
        newx2 = np.sum(x2[:,0])
        total = np.sum(newb3+newx2)
        if ( (total % 10) == 0 ):
            print "Valid"
        else:
            print "Invalid"
        return card_validate()

Есть ли более простой способ сделать это без Numpy?


person derickim    schedule 18.11.2017    source источник
comment
Вы задаете несколько вопросов. Разделите его и сосредоточьтесь на каждом с соответствующими строками кода. Ваше полное решение не требуется для мелких деталей   -  person Gibolt    schedule 18.11.2017
comment
Также обратите внимание, что numpy является огромным излишеством для реализации Луна.   -  person Daniel Roseman    schedule 18.11.2017
comment
есть ли более простой способ сделать это без numpy?   -  person derickim    schedule 18.11.2017
comment
Это забавный игрушечный проект на Haskell. Посмотрите мои решения здесь   -  person Adam Smith    schedule 20.11.2017


Ответы (2)


Следующее можно использовать для реализации логики без использования numpy

a=[[4,0,1,2,8,8,8,8,8,8,8,8,1,8,8,1],[4,0,1,2,8,8,8,8,8,8,8,8,1,8,8,2]] #array of credit card numbers
def validate(creditcard_numbers,tmp):
    even_index=-1

    for j in range(0,16): 
        sum_val=0
        if even_index%2 ==0:  #index calculation for even indices
            val=creditcard_numbers[even_index]*2 
            if val>9:   # add the digits if the value got after multiplying by 2 is two digit number
                while val !=0:
                    rem=val%10
                    val=val/10
                    sum_val=sum_val+rem

                tmp[even_index]=sum_val  #append the temporary list with the new values which is got by adding the digits if the result of multiplying by 2 is a 2 digit number

            else:
                tmp[even_index]=val

        else:
            tmp[even_index]=creditcard_numbers[even_index]
        even_index=even_index-1

    total=0
    for i in tmp:
        total=total+i
    if total%10 == 0:
        return "valid"
    else:
        return "invalid"


for creditcard_numbers in a:
    print creditcard_numbers
    tmp=[0]*len(creditcard_numbers) #temporary list with zeros's 
    result=validate(creditcard_numbers,tmp)
    print result

**ВЫВОД: [4, 0, 1, 2, 8, 8, 8, 8, 8, 8, 8, 8, 1, 8, 8, 1]

действительный

[4, 0, 1, 2, 8, 8, 8, 8, 8, 8, 8, 8, 1, 8, 8, 2]

неверный **

person sanch    schedule 19.11.2017