diff --git a/src/euler04/Cargo.toml b/src/euler04/Cargo.toml new file mode 100644 index 0000000..4520ad9 --- /dev/null +++ b/src/euler04/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "euler04" +version = "0.1.0" +edition = "2021" + +[dependencies] + +[profile.release] +debug = true +strip = false diff --git a/src/euler04/src/main.rs b/src/euler04/src/main.rs new file mode 100644 index 0000000..7502ad8 --- /dev/null +++ b/src/euler04/src/main.rs @@ -0,0 +1,83 @@ +const MIN_NUMBER: i64 = 100; +const MAX_NUMBER: i64 = 999; + +fn main() { + let mut buffer = Vec::new(); + + let mut largest_palindrome = 0; + for i in MIN_NUMBER..=MAX_NUMBER { + for j in MIN_NUMBER..=MAX_NUMBER { + let product = i * j; + if is_palindrome(product, &mut buffer) && product > largest_palindrome { + largest_palindrome = product; + } + } + } + println!("{largest_palindrome}"); +} + +fn is_palindrome(number: i64, buffer: &mut Vec) -> bool { + to_digits(number, buffer); + let number_digits = buffer.len(); + + #[cfg(test)] + dbg!(number, &buffer); + + are_items_palindromic(number_digits, buffer) +} + +fn are_items_palindromic(number_digits: usize, buffer: &[T]) -> bool +where + T: PartialEq, +{ + let mut digits_used = 0; + + let mut iter = buffer.iter(); + while number_digits - digits_used > 1 { + let first = iter.next().unwrap(); + let last = iter.next_back().unwrap(); + if first != last { + return false; + } + + digits_used += 2; + } + true +} + +fn to_digits(number: i64, buffer: &mut Vec) { + buffer.clear(); + + #[cfg(test)] + dbg!(number); + + number + .to_string() + .chars() + .for_each(|digit| buffer.push(digit)) +} + +#[cfg(test)] +mod tests { + use crate::are_items_palindromic; + + #[test] + fn items_palindromes() { + assert!(are_items_palindromic(2, &[0, 0])); + assert!(!are_items_palindromic(2, &[9, 9, 8, 0, 0, 1])); + assert!(are_items_palindromic(2, &[9, 0, 6, 6, 0, 9])); + } + + #[test] + fn is_palindrome() { + let mut buffer = Vec::new(); + assert!(!crate::is_palindrome(998001, &mut buffer)); + } + + #[test] + fn to_digits() { + let mut buffer: Vec = Vec::new(); + crate::to_digits(1, &mut buffer); + assert_eq!(buffer, vec!['1']); + } +}