Day 2: Gift Shop

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL

FAQ

you are viewing a single comment's thread
view the rest of the comments
[โ€“] [S] 3 points 11 months ago* (last edited 11 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;
            }
        }
    }
  • source
  • parent