Luhn

Luhn

中級

はじめに

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は有効です!

無効なカナダのSIN

検証する数値は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は有効ではありません!

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Lisp Flavoured Erlang Exercism

Luhnを始める準備はできましたか?

Exercismに登録すれば、68個の演習、そして本物の人間によるメンタリングとともに、Lisp Flavoured Erlangを学んでマスターできます。すべて無料です。

Luhnを深く掘り下げよう!

Luhnの8つのバージョンを見ていきます。とてもすっきりしたRubyの実装から始めて、命令型と関数型のアプローチをいくつか探り、最後はErikとJeremyが解読に苦労したSQLite版で締めくくります!