22 lines
656 B
Rust
22 lines
656 B
Rust
/// Check a Luhn checksum.
|
|
pub fn is_valid(code: &str) -> bool {
|
|
code.chars()
|
|
.rev()
|
|
.filter(|c| !c.is_whitespace())
|
|
.try_fold((0, 0), |(i, sum), c| {
|
|
c.to_digit(10).map(|d| {
|
|
let added = if 1 == i % 2 {
|
|
let multiplyed = d * 2;
|
|
if multiplyed > 9 {
|
|
multiplyed - 9
|
|
} else {
|
|
multiplyed
|
|
}
|
|
} else {
|
|
d
|
|
};
|
|
(i + 1, sum + added)
|
|
})
|
|
})
|
|
.is_some_and(|(i, sum)| i > 1 && 0 == sum % 10)
|
|
}
|