cp_library_rs/utils/
palindrome.rs1use crate::utils::usize_pow::PowUsize;
4
5pub fn generate_d_digit_number(d: usize) -> impl Iterator<Item = usize> {
8 if d == 0 {
9 0..1
10 } else {
11 10.pow(d - 1)..10.pow(d)
12 }
13}
14
15pub fn inverted_number(mut n: usize) -> usize {
17 let mut r = 0;
18 while n > 0 {
19 r = r * 10 + n % 10;
20 n /= 10;
21 }
22 r
23}
24
25pub fn generate_palindrome_number(N: usize) -> impl Iterator<Item = usize> {
28 let n_length = (N as f32).log10().ceil() as usize;
29
30 (0..=n_length / 2)
31 .flat_map(|d| {
32 (generate_d_digit_number(d).map(move |k| k * 10.pow(d) + inverted_number(k))).chain(
33 generate_d_digit_number(d).flat_map(move |k| {
34 (0..=9).map(move |m| (k * 10 + m) * 10.pow(d) + inverted_number(k))
35 }),
36 )
37 })
38 .skip(1)
40 .take_while(move |k| k <= &N)
41}
42
43pub fn is_palindrome(mut n: usize, a: usize) -> bool {
47 match a {
48 0 => panic!("Base cannot be 0"),
49 1 => return true,
50 _ => {}
51 }
52 let mut ps = vec![];
53 while n > 0 {
54 ps.push(n % a);
55 n /= a;
56 }
57 ps.iter()
58 .zip(ps.iter().rev())
59 .take(ps.len() / 2)
60 .all(|(x, y)| x == y)
61}