A Global Verification Authority nemrég egy kritikus megbízással bízott meg. A városban mindenhol, az online vásárlásoktól a biztonságos bejelentkezésekig, számtalan művelet támaszkodik olyan numerikus azonosítók pontosságára, mint a hitelkártyaszámok, a bankszámlaszámok, a tranzakciós kódok és a követési azonosítók. A Luhn-algoritmus egy egyszerű ellenőrzőösszeg-képlet, amely segít felismerni az elgépelt számokat.
Éppen most érkezett egy adag azonosító az asztalodra. Mindegyiknek át kell mennie a Luhn-teszten, hogy igazoljuk, valódiak. Ha valamelyik nem felel meg, érvénytelenként jelölik meg, így elkerülhetők az olyan hibák, mint a téves tranzakciók vagy a sikertelen számlaellenőrzések.
Gondoskodsz róla, hogy ez rendben megtörténjen? Számos szolgáltatás integritása múlik rajtad.
Állapítsd meg, hogy egy szá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 megengedettek a szóközök, de az ellenőrzés előtt el kell távolítani őket. Minden más nem számjegy karakter nem megengedett.
Az ellenőrizendő szám a 4539 3195 0343 6467.
A Luhn-algoritmus első lépése, hogy a szám végéről indulva megduplázzuk minden második számjegyet, a jobbról számított második számjeggyel kezdve, balra haladva.
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
Ha egy számjegy megduplázásának eredménye nagyobb, mint 9, akkor az eredményből kivonunk 9-et. Végül ezt kapjuk:
8569 6195 0383 3437
Végül összeadjuk az összes számjegyet. Ha az összeg maradék nélkül osztható 10-zel, akkor az eredeti szám érvényes.
8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80
A 80 maradék nélkül osztható 10-zel, tehát a 4539 3195 0343 6467 szám érvényes!
Az ellenőrizendő szám a 066 123 478.
A szám végéről indulunk, és megduplázzuk minden második számjegyet, a jobbról számított második számjeggyel kezdve, balra haladva.
066 123 478
↑ ↑ ↑ ↑ (double these)
Ha egy számjegy megduplázásának eredménye nagyobb, mint 9, akkor az eredményből kivonunk 9-et. Végül ezt kapjuk:
036 226 458
Összeadjuk a számjegyeket:
0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36
A 36 nem osztható maradék nélkül 10-zel, tehát a 066 123 478 szám nem érvényes!
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Factor nyelvet 47 fogalom163 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!