Lapā tiek izmantotas sīkdatnes 

Norēķinu kartes


Problēmas apraksts

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.

Lūna algoritms


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

Nosacījumi


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!

Testpiemēri


Ievaddati Izvaddati
4003600000000014 VISA
6176292929 INVALID
371449635398431 AMEX
5555555555554444 MasterCard
4111111111111111 VISA

Kad esi darbu pabeidzis, iesniedz saiti uz GitHub repozitoriju Moodle sistēmā.