add 04
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "euler04"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
|
||||
[profile.release]
|
||||
debug = true
|
||||
strip = false
|
||||
@@ -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']);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user