Regex free solution. Much faster (233ms vs ~4s)
fn check_invalid3(p0: usize) -> u32 {
let mut i = 0;
let mut found_count = 0;
loop {
let mut v = p0;
i += 1;
let mask = 10_usize.pow(i);
if mask >= p0 {
// Mask is larger than input, we have exhausted available matchers.
return found_count;
}
let remainer = v % mask;
if remainer < 10_usize.pow(i - 1) {
// Zero prefix, won't be a pattern. (01, 002, etc)
continue;
}
let mut count = 1;
loop {
let new_v = v / mask;
if new_v % mask != remainer {
// doesnt repeat.
break;
}
if new_v / mask == 0 {
// has repeated, so we have found at least one pattern. Lets keep going to see if there is a simpler pattern.
found_count = count;
break;
}
count += 1;
v = new_v;
}
}
}