Global Verification Authorityでは、重大な任務を任されたばかりです。 街のいたるところで、オンライン購入から安全なログインまで、数え切れないほどの処理が、クレジットカード番号、銀行口座番号、取引コード、追跡IDなどの数値識別子の正確さに支えられています。 Luhnアルゴリズムは、入力ミスのある数値を見つけるのに役立つ、シンプルなチェックサムの計算式です。
机の上に、識別子の束が届いたばかりです。 それらはすべて、正当なものであることを確かめるため、Luhnテストに合格する必要があります。 一つでも合格しなければ、無効としてフラグが立てられ、誤った取引や口座確認の失敗といったミスを防ぎます。
これを正しくやり遂げられますか? 多くのサービスの信頼性が、この任務にかかっています。
数値がLuhnの公式に従って有効かどうかを判定します。
数値は文字列として渡されます。
長さが1以下の文字列は有効ではありません。入力にはスペースを含めることができますが、検証の前に取り除く必要があります。それ以外の数字以外の文字は許可されません。
検証する数値は4539 3195 0343 6467です。
Luhnアルゴリズムの最初のステップは、数値の末尾から始めて、右から2番目の桁から左に向かって1つおきの桁を2倍にすることです。
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
桁を2倍にした結果が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は有効です!
検証する数値は066 123 468です。
数値の末尾から始めて、右から2番目の桁から左に向かって1つおきの桁を2倍にします。
066 123 478
↑ ↑ ↑ ↑ (double these)
桁を2倍にした結果が9より大きい場合は、その結果から9を引きます。すると、次のようになります。
036 226 458
桁を合計します。
0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36
36は10で割り切れないので、066 123 478は有効ではありません!
Luhnの8つのバージョンを見ていきます。とてもすっきりしたRubyの実装から始めて、命令型と関数型のアプローチをいくつか探り、最後はErikとJeremyが解読に苦労したSQLite版で締めくくります!