Luhn

Luhn

Μέτριο

Εισαγωγή

Στην Global Verification Authority, μόλις σου ανέθεσαν μια κρίσιμη αποστολή. Σε όλη την πόλη, από online αγορές μέχρι ασφαλείς συνδέσεις, αμέτρητες λειτουργίες βασίζονται στην ακρίβεια αριθμητικών αναγνωριστικών όπως οι αριθμοί πιστωτικών καρτών, οι αριθμοί τραπεζικών λογαριασμών, οι κωδικοί συναλλαγών και τα αναγνωριστικά παρακολούθησης. Ο αλγόριθμος Luhn είναι ένας απλός τύπος αθροίσματος ελέγχου που βοηθά στον εντοπισμό λανθασμένων αριθμών.

Μια παρτίδα αναγνωριστικών μόλις έφτασε στο γραφείο σου. Όλα τους πρέπει να περάσουν τη δοκιμή Luhn για να διασφαλιστεί ότι είναι γνήσια. Αν κάποιο αποτύχει, θα χαρακτηριστεί μη έγκυρο, αποτρέποντας λάθη όπως λανθασμένες συναλλαγές ή αποτυχημένες επαληθεύσεις λογαριασμών.

Μπορείς να διασφαλίσεις ότι αυτό θα γίνει σωστά; Η ακεραιότητα πολλών υπηρεσιών εξαρτάται από εσένα.

Οδηγίες

Προσδιόρισε αν ένας αριθμός είναι έγκυρος σύμφωνα με τον τύπο του Luhn.

Ο αριθμός θα σου δοθεί ως συμβολοσειρά.

Έλεγχος εγκυρότητας ενός αριθμού

Οι συμβολοσειρές με μήκος 1 ή μικρότερο δεν είναι έγκυρες. Τα κενά επιτρέπονται στην είσοδο, αλλά θα πρέπει να αφαιρούνται πριν από τον έλεγχο. Όλοι οι άλλοι χαρακτήρες που δεν είναι ψηφία δεν επιτρέπονται.

Παραδείγματα

Έγκυρος αριθμός πιστωτικής κάρτας

Ο αριθμός που θα ελεγχθεί είναι ο 4539 3195 0343 6467.

Το πρώτο βήμα του αλγορίθμου του Luhn είναι να ξεκινήσεις από το τέλος του αριθμού και να διπλασιάσεις κάθε δεύτερο ψηφίο, αρχίζοντας από το δεύτερο ψηφίο από τα δεξιά και κινούμενος προς τα αριστερά.

4539 3195 0343 6467
↑ ↑  ↑ ↑  ↑ ↑  ↑ ↑  (double these)

Αν το αποτέλεσμα του διπλασιασμού ενός ψηφίου είναι μεγαλύτερο από 9, αφαιρούμε 9 από αυτό το αποτέλεσμα. Καταλήγουμε σε:

8569 6195 0383 3437

Τέλος, αθροίζουμε όλα τα ψηφία. Αν το άθροισμα διαιρείται ακριβώς με το 10, ο αρχικός αριθμός είναι έγκυρος.

8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80

Το 80 διαιρείται ακριβώς με το 10, άρα ο αριθμός 4539 3195 0343 6467 είναι έγκυρος!

Μη έγκυρος καναδικός SIN

Ο αριθμός που θα ελεγχθεί είναι ο 066 123 478.

Ξεκινάμε από το τέλος του αριθμού και διπλασιάζουμε κάθε δεύτερο ψηφίο, αρχίζοντας από το δεύτερο ψηφίο από τα δεξιά και κινούμενοι προς τα αριστερά.

066 123 478
 ↑  ↑ ↑  ↑  (double these)

Αν το αποτέλεσμα του διπλασιασμού ενός ψηφίου είναι μεγαλύτερο από 9, αφαιρούμε 9 από αυτό το αποτέλεσμα. Καταλήγουμε σε:

036 226 458

Αθροίζουμε τα ψηφία:

0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36

Το 36 δεν διαιρείται ακριβώς με το 10, άρα ο αριθμός 066 123 478 δεν είναι έγκυρος!

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Lean Exercism

Έτοιμος να ξεκινήσεις την άσκηση Luhn;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Lean με 100 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.

Αναλυτική ματιά στο Luhn!

Εξερευνούμε 8 διαφορετικές εκδοχές του Luhn, ξεκινώντας από μια πολύ τακτοποιημένη υλοποίηση σε Ruby, περνώντας από κάποιες προστακτικές και συναρτησιακές προσεγγίσεις και καταλήγοντας σε μια έκδοση σε SQLite που χρειάστηκε αρκετή δουλειά από τον Erik και τον Jeremy για να την αποκρυπτογραφήσουν!