Skip to content

Instantly share code, notes, and snippets.

@worldmind
Last active February 13, 2017 09:44
Show Gist options
  • Save worldmind/a66e801ddc9de2ed6817c91b4ef69883 to your computer and use it in GitHub Desktop.
Save worldmind/a66e801ddc9de2ed6817c91b4ef69883 to your computer and use it in GitHub Desktop.
def validate_check_sum(card_number):
newlist = list(map(lambda x: double_and_sum_digits4odd(*x), enumerate(card_number[::-1])))
val = sum(newlist[::-1])
if val % 10 == 0:
return 'valid'
else:
return 'not valid'
def sum_digits(x):
digits = str(x)
return sum(map(int, digits))
def double_and_sum_digits4odd(i, x):
if i % 2 == 0:
return x
else:
return sum_digits(x*2)
card_number_int = int(input())
card_number = list(map(int,str(card_number_int)))
print(validate_check_sum(card_number))
@vadim2404
Copy link

можно сделать в одну строку всё это дело (но не очень читаемо, см. ниже). Зависит от того, какие цели преследуешь
некоторые вычисления можно сделать lazy
проверка на чётную/нечётную позицию можно вынести на битовую арифметику (у нечётных числе последний бит всегда 1)
сумма цифр двузначного числа будет равно этому числу за вычетом девяти
когда считаешь сумму, нет смысла в том, чтобы обратно массив разворачивать

from itertools import imap

def luhn(card):
    return reduce(lambda acc, x: acc + (x if x < 10 else x - 9), imap(lambda t: int(t[1]) if not (t[0] & 1) else 2 * int(t[1]), enumerate(reversed(str(card)))), 0) % 10 == 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment