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