Hoje Há muito tempo atrás implementei o algorítimo de validação de cpf em javascript e em rust
para demonstrar como é possível a não executar uma única declaração de
variável (considerando que receber parâmetro não conta como declaraçao)
utilizando o estilo de programação method chaining.
let validate = (cpf) => cpf
.match(/\d/g)
.map(digito => parseInt(digito))
.map(
(digito, idx) => [
(10 - idx) * digito,
(11 - idx) * digito
])
.reduce(
(aggregate, digit, index) => [
aggregate[0] + (index < 9 ? digit[0] : 0),
aggregate[1] + (index < 10 ? digit[1] : 0)
],
[0, 0]
)
.map(sum => sum * 10 % 11)
.join("") === cpf.slice(-2);
console.log(validate("999.999.999-99"));
console.log(validate("999.999.999-98"));
// saida:
// true
// false
fn main() {
let cpf = |cpf: &str| {
cpf.chars()
.filter_map(|c| c.to_digit(10).map(|x| x as usize))
.enumerate()
.map(|(i, v)| {
(
(i < 9).then_some((10 - i) * v).unwrap_or(0),
(i < 10).then_some((11 - i) * v).unwrap_or(0),
)
})
.reduce(|(a0, a1), (v0, v1)| (a0 + v0, a1 + v1))
.map(|(a, b)| (a * 10 % 11, b * 10 % 11))
.map(|(a, b)| format!("{}{}", a, b))
.map(|a| a == cpf[cpf.len() - 2..])
.unwrap_or(false)
};
assert_eq!(cpf("999.999.999-99"), true);
assert_eq!(cpf("999.999.999-98"), false);
}