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 478です。
数値の末尾から始めて、右から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は有効ではありません!
Exercismに登録すれば、68個の演習、そして本物の人間によるメンタリングとともに、Lisp Flavoured Erlangを学んでマスターできます。すべて無料です。
Luhnの8つのバージョンを見ていきます。とてもすっきりしたRubyの実装から始めて、命令型と関数型のアプローチをいくつか探り、最後はErikとJeremyが解読に苦労したSQLite版で締めくくります!