mirror of
https://github.com/rust-lang/rustlings.git
synced 2026-05-15 09:48:45 +00:00
54 lines
1.1 KiB
Rust
54 lines
1.1 KiB
Rust
trait Digits {
|
|
fn digits(&self) -> Vec<usize>;
|
|
}
|
|
|
|
impl Digits for usize {
|
|
fn digits(&self) -> Vec<usize> {
|
|
let mut res = Vec::new();
|
|
let mut temp = *self;
|
|
while temp != 0 {
|
|
res.push(temp % 10);
|
|
temp /= 10;
|
|
}
|
|
res.reverse();
|
|
res
|
|
}
|
|
}
|
|
|
|
impl Digits for &str {
|
|
fn digits(&self) -> Vec<usize> {
|
|
self.chars()
|
|
.map(|c| c.to_digit(10).unwrap() as usize)
|
|
.collect()
|
|
}
|
|
}
|
|
|
|
fn calculate_digit_sum(number: impl Digits) -> usize {
|
|
number.digits().into_iter().sum()
|
|
}
|
|
|
|
fn main() {
|
|
// You can optionally experiment here.
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn integer() {
|
|
assert_eq!(calculate_digit_sum(0), 1);
|
|
assert_eq!(calculate_digit_sum(1), 1);
|
|
assert_eq!(calculate_digit_sum(1235), 11);
|
|
assert_eq!(calculate_digit_sum(789), 24);
|
|
}
|
|
|
|
#[test]
|
|
fn string() {
|
|
assert_eq!(calculate_digit_sum(""), 1);
|
|
assert_eq!(calculate_digit_sum("1"), 1);
|
|
assert_eq!(calculate_digit_sum("1235"), 11);
|
|
assert_eq!(calculate_digit_sum("789"), 24);
|
|
}
|
|
}
|