This commit is contained in:
timeshifter
2024-09-08 11:25:15 +02:00
parent 5100bfea49
commit eb21228611
2 changed files with 93 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
[package]
name = "euler04"
version = "0.1.0"
edition = "2021"
[dependencies]
[profile.release]
debug = true
strip = false
+83
View File
@@ -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<char>) -> 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<T>(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<char>) {
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<char> = Vec::new();
crate::to_digits(1, &mut buffer);
assert_eq!(buffer, vec!['1']);
}
}