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 · 最終更新: 2024/02/25 12:14 by nullpon