All'Autorità Globale di Verifica ti è appena stato affidato un incarico critico. In tutta la città, dagli acquisti online agli accessi sicuri, innumerevoli operazioni si basano sull'accuratezza di identificatori numerici come i numeri delle carte 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 usata per aiutare a individuare i numeri inseriti in modo errato.
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à contrassegnato come non valido, evitando errori come transazioni sbagliate o verifiche del conto non riuscite.
Riesci ad assicurarti che venga fatto nel modo giusto? L'integrità di molti servizi dipende da te.
Determina se un numero è valido secondo la formula di Luhn.
Il numero verrà fornito come stringa.
Le stringhe di lunghezza pari o inferiore a 1 non sono valide. Gli spazi sono ammessi nell'input, ma vanno rimossi prima del controllo. Tutti gli altri caratteri che non sono cifre non sono ammessi.
Il numero da controllare è 4539 3195 0343 6467.
Il primo passo dell'algoritmo di Luhn consiste nel partire dalla fine del numero e raddoppiare ogni seconda cifra, iniziando dalla seconda cifra da destra e procedendo verso sinistra.
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
Se il risultato del raddoppio di una cifra è maggiore di 9, sottraiamo 9 da quel risultato. Otteniamo così:
8569 6195 0383 3437
Infine, sommiamo tutte le cifre. Se la somma è esattamente divisibile per 10, il numero originale è valido.
8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80
80 è esattamente divisibile per 10, quindi il numero 4539 3195 0343 6467 è valido!
Il numero da controllare è 066 123 478.
Partiamo dalla fine del numero e raddoppiamo ogni seconda cifra, iniziando dalla seconda cifra da destra e procedendo verso sinistra.
066 123 478
↑ ↑ ↑ ↑ (double these)
Se il risultato del raddoppio di una cifra è maggiore di 9, sottraiamo 9 da quel risultato. Otteniamo così:
036 226 458
Sommiamo le cifre:
0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36
36 non è esattamente divisibile per 10, quindi il numero 066 123 478 non è valido!
Il buffer per la stringa di input occupa i byte da 64 a 319 della memoria lineare.
Iscriviti a Exercism per imparare e padroneggiare WebAssembly con 87 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!