add 27
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
[package]
|
||||||
|
name = "euler26"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
itertools = "0.14.0"
|
||||||
|
rug = "*"
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
use itertools::Itertools;
|
||||||
|
use rug::Float;
|
||||||
|
|
||||||
|
const PRECISION: u32 = 16_192;
|
||||||
|
const MIN: usize = 2;
|
||||||
|
const MAX: usize = 1_000;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut largest_number = 1;
|
||||||
|
let mut largest_len = 1;
|
||||||
|
|
||||||
|
for number in MIN..MAX {
|
||||||
|
println!("{number}");
|
||||||
|
if let Some(value) = find_cycle_length(number as f64) {
|
||||||
|
if value > largest_len {
|
||||||
|
largest_len = value;
|
||||||
|
largest_number = number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{largest_number}: {largest_len}");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_cycle_length(number: f64) -> Option<usize> {
|
||||||
|
let n = Float::with_val(PRECISION, 1.);
|
||||||
|
let d = Float::with_val(PRECISION, number);
|
||||||
|
let r = n / d;
|
||||||
|
let s = r.to_string();
|
||||||
|
|
||||||
|
let max_length = s.len() / 3;
|
||||||
|
|
||||||
|
let s = sanitize_string(s);
|
||||||
|
|
||||||
|
for skip in 0..max_length {
|
||||||
|
for length in 1..max_length {
|
||||||
|
let chunks = s.chars().skip(skip).chunks(length);
|
||||||
|
let mut iter = chunks.into_iter();
|
||||||
|
|
||||||
|
let first: String = iter.next().unwrap().collect();
|
||||||
|
let second: String = iter.next().unwrap().collect();
|
||||||
|
let third: String = iter.next().unwrap().collect();
|
||||||
|
|
||||||
|
if first == second && second == third {
|
||||||
|
return Some(length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sanitize_string(s: String) -> String {
|
||||||
|
let exponent = s.chars().last().unwrap().to_digit(10).unwrap();
|
||||||
|
|
||||||
|
let mut s: String = s
|
||||||
|
.chars()
|
||||||
|
.take_while(|c| !c.is_ascii_lowercase())
|
||||||
|
.filter(|c| *c != '.')
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let add_leading_zeros = exponent - 1;
|
||||||
|
for _ in 0..add_leading_zeros {
|
||||||
|
s.insert(0, '0');
|
||||||
|
}
|
||||||
|
s
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::find_cycle_length;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn case_3() {
|
||||||
|
let result = find_cycle_length(3.);
|
||||||
|
assert_eq!(result, Some(1))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn case_6() {
|
||||||
|
let result = find_cycle_length(6.);
|
||||||
|
assert_eq!(result, Some(1))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn case_7() {
|
||||||
|
let result = find_cycle_length(7.);
|
||||||
|
assert_eq!(result, Some(6))
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user