use crate::Solution;
use pmath::digits::is_palindrome;
problem!(Problem0036, 36, "Double-base Palindromes");
impl Solution for Problem0036 {
fn solve(&self) -> String {
let mut sum = 0;
let mut x = 1;
let mut generated_palindrome = binary_palindrome(x, true);
while generated_palindrome < LIMIT {
if is_palindrome(generated_palindrome, 10) {
sum += generated_palindrome;
}
x += 1;
generated_palindrome = binary_palindrome(x, true);
}
x = 1;
generated_palindrome = binary_palindrome(x, false);
while generated_palindrome < LIMIT {
if is_palindrome(generated_palindrome, 10) {
sum += generated_palindrome;
}
x += 1;
generated_palindrome = binary_palindrome(x, false);
}
sum.to_string()
}
}
const LIMIT: u64 = 1_000_000;
fn binary_palindrome(mut x: u64, longer: bool) -> u64 {
let mut result = x;
if !longer {
x >>= 1;
}
while x != 0 {
result <<= 1;
result |= x & 1;
x >>= 1;
}
result
}