You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
4.0 KiB
184 lines
4.0 KiB
use std::collections::HashSet; |
|
|
|
fn er() -> Vec<u32> { |
|
let mut nums = Vec::new(); |
|
let size = 1000000; |
|
for n in 0..size+1 { nums.push(true); } |
|
let mut p = 1; |
|
loop { |
|
let mut found = false; |
|
for i in p+1..size { |
|
if nums[i] { |
|
found = true; |
|
p = i; |
|
break; |
|
} |
|
} |
|
if !found { break; } |
|
for i in (2 * p .. size).step_by(p) { |
|
nums[i] = false; |
|
} |
|
} |
|
let mut res = Vec::new(); |
|
for i in 2..size { |
|
if nums[i] { res.push(i as u32); } |
|
} |
|
return res; |
|
} |
|
|
|
fn rt(n: u32) -> u32 { |
|
let s = n.to_string(); |
|
let mut chars = s.chars(); |
|
let f = chars.next().unwrap(); |
|
//chars.next_back(); |
|
let mut res = String::from(chars.as_str()); |
|
res.push(f); |
|
res.parse::<u32>().unwrap() |
|
} |
|
|
|
fn rp(n: u32, is: u32, k: u8) -> u32 { |
|
let s = n.to_string(); |
|
let mut hs = HashSet::new(); |
|
let mut iss = is; |
|
while iss > 0 { |
|
hs.insert(iss%10); |
|
iss/=10; |
|
} |
|
|
|
let mut ress = 0; |
|
let mut index = 0; |
|
for c in s.chars() { |
|
ress*=10; |
|
if !hs.contains(&(index+1)) { |
|
let cc = c.to_string().parse::<u32>().unwrap(); |
|
//println!("--{} {} {} {}", cc, c, index+1, s); |
|
ress += cc; |
|
} else { |
|
ress += k as u32; |
|
} |
|
index+=1; |
|
} |
|
return ress; |
|
} |
|
|
|
fn replacements(n: u32, is:u32, ps: &HashSet<u32>) -> usize { |
|
//let mut res = Vec::new(); |
|
//println!("-------"); |
|
let mut res = 0; |
|
let mut found = false; |
|
for i in 0..=9 { |
|
let r=rp(n, is, i); |
|
if r.to_string().len() < n.to_string().len() { continue; } |
|
if r == n { found = true; } |
|
//println!("{} {} {} {}", r, n, is, i); |
|
if ps.contains(&r) { |
|
//println!(":: {} {} {} {}", r, n,is,i); |
|
//res.push(r); |
|
res+=1; |
|
} |
|
} |
|
if !found { return 0; } |
|
return res; |
|
} |
|
|
|
fn rm(n: u32, _: &Vec<u32>, ps: &HashSet<u32>) -> usize { |
|
let len = n.to_string().len(); |
|
let rms = lpp(len as u8); |
|
let mut max_rpls = 0; |
|
//println!("len {}", rms.len()); |
|
for r in rms.iter() { |
|
if r.to_string().len() > len { |
|
break; |
|
} |
|
//if !is_diff_tn(*r, len as u32) { |
|
// continue; |
|
//} |
|
let rpsss = replacements(n, *r, ps); |
|
//println!("{} {} {}", rpsss, n, *r); |
|
if rpsss > max_rpls { |
|
max_rpls = rpsss; |
|
//println!("-------- {}", *r); |
|
//for r in rpsss.iter() { |
|
// println!("{}", r); |
|
//} |
|
} |
|
} |
|
return max_rpls; |
|
} |
|
|
|
fn b_t_is(n: u32) -> u32 { |
|
let mut rr = n; |
|
let mut index = 1; |
|
let mut res = 0; |
|
while rr > 0 { |
|
let c = rr % 2; |
|
if c == 1 { |
|
res*=10; |
|
res+=index; |
|
} |
|
index+=1; |
|
rr/=2; |
|
} |
|
return res; |
|
} |
|
|
|
fn lpp(n: u8) -> Vec<u32> { |
|
let mut res = Vec::new(); |
|
let bt = 0; |
|
let mut tn = 1; |
|
for _ in 0..n { |
|
tn *= 2; |
|
} |
|
for i in 1..tn { |
|
res.push(b_t_is(i)); |
|
} |
|
|
|
return res; |
|
} |
|
|
|
|
|
fn main() { |
|
//let r = b_t_is(5); |
|
//println!("{}", r); |
|
//return; |
|
//let pmsss = lpp(4); |
|
//for p in pmsss.iter() { |
|
// println!("{}", p); |
|
//} |
|
//return; |
|
let ps = er(); |
|
let mut hs = HashSet::new(); |
|
for p in ps.iter() { |
|
hs.insert(*p); |
|
} |
|
//let r = rp(56003, 13, 1); |
|
//let id = is_diff(763); |
|
//println!("..."); |
|
let rms = lpp(6); |
|
//for r in rs.iter() { |
|
// println!("{}", r); |
|
//} |
|
// |
|
//println!(".x."); |
|
//let v8res = rm(120383, &rms, &hs); // 100109, |
|
//for p in v8res.iter() { |
|
// println!("{}", v8res); |
|
//} |
|
//return; |
|
|
|
for p in ps.iter() { |
|
let l = rm(*p, &rms, &hs); |
|
//println!("{}", p); |
|
if l == 8 { |
|
//if *p == 56003 { |
|
println!("{}", p); |
|
//} |
|
break; |
|
} |
|
} |
|
//println!("{}", bs); |
|
//for r in rsss { |
|
// println!("{}", r); |
|
//} |
|
} |
|
|
|
|