Alla Global Verification Authority ti è appena stato affidato un incarico fondamentale. In tutta la città, dagli acquisti online agli accessi sicuri, innumerevoli operazioni si affidano all'accuratezza di identificatori numerici come i numeri di carta di credito, i numeri di conto bancario, i codici di transazione e gli ID di tracciamento. L'algoritmo di Luhn è una semplice formula di checksum che serve a garantire che questi numeri siano validi e privi di errori.
Un lotto di identificatori è appena arrivato sulla tua scrivania. Tutti devono superare il test di Luhn per garantire che siano legittimi. Se qualcuno non lo supera, verrà segnalato come non valido, evitando così errori o frodi, come transazioni errate o accessi non autorizzati.
Riesci a fare in modo che tutto sia fatto per bene? L'integrità di molti servizi dipende da te.
Stabilisci se un numero di carta di credito è valido secondo la formula di Luhn.
Il numero verrà fornito come stringa.
Le stringhe di lunghezza pari o inferiore a 1 non sono valide. Nell'input sono ammessi gli spazi, ma vanno rimossi prima del controllo. Tutti gli altri caratteri non numerici non sono ammessi.
4539 3195 0343 6467
Il primo passo dell'algoritmo di Luhn consiste nel raddoppiare ogni seconda cifra, partendo da destra. Raddoppieremo
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
Se raddoppiando la cifra si ottiene un numero maggiore di 9, sottrai 9 dal prodotto. Ecco i risultati del nostro raddoppio:
8569 6195 0383 3437
Poi somma tutte le cifre:
8+5+6+9+6+1+9+5+0+3+8+3+3+4+3+7 = 80
Se la somma è esattamente divisibile per 10, il numero è valido. Questo numero è valido!
8273 1232 7352 0569
Raddoppia le seconde cifre, partendo da destra
7253 2262 5312 0539
Somma le cifre
7+2+5+3+2+2+6+2+5+3+1+2+0+5+3+9 = 57
57 non è esattamente divisibile per 10, quindi questo numero non è valido.
Iscriviti a Exercism per imparare e padroneggiare Scala con 95 esercizi e il mentoring di persone reali, tutto gratis.
Esploriamo 8 versioni diverse di Luhn, partendo da un'implementazione Ruby molto pulita, passando per alcuni approcci imperativi e funzionali, e arrivando a una versione SQLite che ha richiesto un po' di lavoro a Erik e Jeremy per essere decifrata!