check_digit
差分
このページの2つのバージョン間の差分を表示します。
| check_digit [2024/02/25 12:14] – 作成 nullpon | check_digit [2024/02/25 13:39] (現在) – nullpon | ||
|---|---|---|---|
| 行 3: | 行 3: | ||
| ## Luhnアルゴリズム | ## Luhnアルゴリズム | ||
| + | |||
| + | チェック処理 | ||
| ```ruby | ```ruby | ||
| 行 9: | 行 11: | ||
| # Luhn formula check digit | # Luhn formula check digit | ||
| s = input.split("" | s = input.split("" | ||
| - | # 偶数桁の場合は2倍する(iは0から始まるので奇数桁の場合はiが奇数) | + | # 偶数桁の場合は2倍する(iは0から始まるのでevenではなく、oddで偶数桁を判定) |
| if i.odd? | if i.odd? | ||
| n *= 2 | n *= 2 | ||
| - | end | + | n > 9 ? n - 9 : n # 10以上の場合は1の位と10の位の数字を足す、を最適化 |
| - | + | ||
| - | # 10以上の場合は1の位と10の位を足す(18が最大なので10の位は必ず1) | + | |
| - | if n < 10 | + | |
| - | n | + | |
| else | else | ||
| - | n = n % 10 + 1 | + | n |
| end | end | ||
| - | end.sum | + | end.sum |
| - | if (s % 10) == 0 | + | if s == 0 |
| - | puts " | + | puts " |
| + | exit 0 | ||
| else | else | ||
| - | puts " | + | puts " |
| + | exit 1 | ||
| end | end | ||
| ``` | ``` | ||
| + | チェックディジットを求める | ||
| + | ```ruby | ||
| + | code = ARGV[0] | ||
| + | |||
| + | # Luhn formula check digit | ||
| + | d = code.split("" | ||
| + | if i.even? | ||
| + | n *= 2 | ||
| + | n > 9 ? n - 9 : n | ||
| + | else | ||
| + | n | ||
| + | end | ||
| + | end.sum % 10 | ||
| + | |||
| + | # 10 - d が 0 の場合は 0 を出力、それ以外は 10 - d を出力 | ||
| + | puts d == 0 ? 0 : 10 - d | ||
| + | ``` | ||
| </ | </ | ||
check_digit.1708863278.txt.gz · 最終更新: by nullpon