Day 2: Gift Shop

Megathread guidelines

FAQ

  • CameronDevOPM
    link
    fedilink
    arrow-up
    3
    ·
    edit-2
    3 months ago

    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;
                }
            }
        }