A Globális Ellenőrzési Hatóságnál épp most bíztak rád egy kritikus feladatot. A városban mindenhol, az online vásárlásoktól a biztonságos bejelentkezésekig, számtalan művelet múlik a numerikus azonosítók pontosságán: hitelkártyaszámokon, bankszámlaszámokon, tranzakciós kódokon és követési azonosítókon. A Luhn-algoritmus egy egyszerű ellenőrző összeg képlet, amellyel ellenőrizni lehet, hogy ezek a számok érvényesek és hibátlanok.
Épp most került az asztalodra egy köteg azonosító. Mindegyiküknek át kell mennie a Luhn-teszten, ami igazolja, hogy valódiak. Ha valamelyik megbukik, érvénytelenként jelöljük meg, így megelőzhetők a hibák és a csalások, például a téves tranzakciók vagy az illetéktelen hozzáférés.
Biztosítani tudod, hogy minden helyesen történjen? Sok szolgáltatás integritása múlik rajtad.
Határozd meg, hogy egy hitelkártyaszám érvényes-e a Luhn-formula szerint.
A számot stringként kapod meg.
Az 1 vagy annál rövidebb stringek nem érvényesek. A bemenetben lehetnek szóközök, de azokat az ellenőrzés előtt el kell távolítani. Minden más nem számjegy karakter nem megengedett.
4539 3195 0343 6467
A Luhn-algoritmus első lépése, hogy a jobb széltől kezdve minden második számjegyet megduplázunk. A következőket duplázzuk meg:
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
Ha a duplázás eredménye nagyobb, mint 9, akkor a szorzatból vonj ki 9-et. A duplázás eredménye:
8569 6195 0383 3437
Ezután add össze az összes számjegyet:
8+5+6+9+6+1+9+5+0+3+8+3+3+4+3+7 = 80
Ha az összeg maradék nélkül osztható 10-zel, akkor a szám érvényes. Ez a szám érvényes!
8273 1232 7352 0569
Duplázd meg minden második számjegyet a jobb széltől kezdve
7253 2262 5312 0539
Add össze a számjegyeket
7+2+5+3+2+2+6+2+5+3+1+2+0+5+3+9 = 57
Az 57 nem osztható maradék nélkül 10-zel, ezért ez a szám nem érvényes.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Scala nyelvet 95 feladat segítségével, valódi emberi mentorálással, mindez ingyen.
A Luhn 8 különböző változatát járjuk körbe: kezdjük egy nagyon letisztult Ruby-implementációval, megnézünk néhány imperatív és funkcionális megközelítést, végül egy SQLite-változattal zárunk, amelynek megfejtése Eriknek és Jeremynek is némi munkájába került!