Norēķinu kartes mūsdienās plaši lieto bezskaidras naudas norēķiniem, lai apmaksātu pirkumus. Uz kartes vienmēr ir uzdrukāts tās unikālais numurs, kurš glabājas datu bāzē. Karšu numuri ir pietiekoši gari un tiem ir savas likumsakarības... American Express kartēm ir 15 cipari, MasterCard kartēm ir 16 cipari, bet Visa kartēm ir 13 vai 16 ciparus gari karšu numuri.
Sākuma cipari norāda kartes piederību noteiktai grupai. Ja numurs sākas ar 34
vai 37
, tā ir American Express karte. Ja sākumi cipari ir 51
, 52
, 53
, 54
vai 55
, tad tā ir MasterCard karte. Savukārt, ja numurs sākas ar 4
, tad tā ir Visa karte.
Papildus aizsardzībai lieto tā saukto "čeksummu" jeb matemātisku sakarību starp visiem kartes cipariem. To sauc par Lūna algoritmu. Tas palīdz izslēgt kļūdas iespēju, sastādot kartes numuru.
Hanss Pīters Lūns no kompānijas IBM sastādīja algoritmu, ko karšu numuru validācijai lieto vēl šobaltdien.
Algoritms darbojas sekojoši:
1) Ņemam katru otro ciparu sākot no iepriekšpēdējā (virzienā pa kreisi) un sareizinām to ar 2
4003600000000014
Izskatās tas sekojoši:
1•2 + 0•2 + 0•2 + 0•2 + 0•2 + 6•2 + 0•2 + 4•2
2) Iegūstam virkni:
2 + 0 + 0 + 0 + 0 + 12 + 0 + 8
3) Saskaitām visu virknes skaitļu ciparus kopā
2 + 0 + 0 + 0 + 0 + 1 + 2 + 0 + 8 = 13
4) Saskaita visus pārējos ciparus, kas netika saskaitīti 1. solī
4 + 0 + 0 + 0 + 0 + 0 + 3 + 0 = 7
5) Sasummē rezultātus kopā
13 + 7 = 20
Ja gala summa beidzas ar 0, kartes numurs ir derīgs
Piemēru var apskatīt šeit
Izveido mapi kartes, kurā izveido failu numuri.py. Sastādi tajā algoritmu, kas saņem ievadītu kartes numuru, pārbauda tā garumu, sākuma ciparus un pārbauda "čeksummu" pēc Lūna algoritma. Ja karte ir derīga, izvada VISA
, MasterCard
vai AMEX
, citādi izvada INVALID
.
# returns True if checksum is valid, otherwise returns False
def Luhn_checks_my_card(card_number):
...
return ...
# returns name of card if digits are valid, otherwise returns "INVALID"
def check_card_type(card_number):
...
return ...
# main logic
def main():
card_number = input("Card number: ")
if Luhn_checks_my_card():
print(check_card_type())
else:
print("INVALID")
Kad algoritms darbojas, testu failā test_cards.py sastādi 2 testa funkcijas ar 5 testa gadījumiem katrā.
Izmanto testpiemērus!
Ievaddati | Izvaddati |
---|---|
4003600000000014 | VISA |
6176292929 | INVALID |
371449635398431 | AMEX |
5555555555554444 | MasterCard |
4111111111111111 | VISA |
Kad esi darbu pabeidzis, iesniedz saiti uz GitHub repozitoriju Moodle sistēmā.