Skip to content

Commit 5558c5b

Browse files
committed
Speedup part 2
1 parent 83e6d58 commit 5558c5b

File tree

1 file changed

+21
-22
lines changed

1 file changed

+21
-22
lines changed

src/y2025/day2.rs

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,33 +29,32 @@ fn invalid(n: u64) -> bool {
2929
}
3030

3131
// max in input is 10 digits, but higher than max u32
32+
#[allow(clippy::zero_prefixed_literal, reason = "describes repeat pattern")]
3233
fn invalid2(n: u64) -> bool {
34+
// a repeating digit will be a multiple
35+
// eg if 6 digits, will be AAAAAA or ABABAB or ABCABC
36+
// -> divisible by 111111 or 010101 or 001001
3337
match n {
3438
0..=9 => false,
35-
10..=99 => check(n, 1, 2),
36-
100..=999 => check(n, 1, 3),
37-
1000..=9999 => check(n, 1, 4) || check(n, 2, 2),
38-
10000..=99999 => check(n, 1, 5),
39-
100000..=999999 => check(n, 1, 6) || check(n, 2, 3) || check(n, 3, 2),
40-
1000000..=9999999 => check(n, 1, 7),
41-
10000000..=99999999 => check(n, 1, 8) || check(n, 2, 4) || check(n, 4, 2),
42-
100000000..=999999999 => check(n, 1, 9) || check(n, 3, 3),
43-
1000000000..=9999999999 => check(n, 1, 10) || check(n, 2, 5) || check(n, 5, 2),
44-
_ => panic!(),
45-
}
46-
}
47-
48-
// check if n in decimal is made up of R repeats of D digits
49-
fn check(mut n: u64, digits: u32, repeats: u32) -> bool {
50-
let divisor = 10u32.pow(digits) as u64;
51-
let pat = n % divisor;
52-
for _ in 1..repeats {
53-
n /= divisor;
54-
if pat != n % divisor {
55-
return false;
39+
10..=99 => n.is_multiple_of(11),
40+
100..=999 => n.is_multiple_of(111),
41+
1000..=9999 => n.is_multiple_of(1111) || n.is_multiple_of(0101),
42+
10000..=99999 => n.is_multiple_of(11111),
43+
100000..=999999 => {
44+
n.is_multiple_of(111111) || n.is_multiple_of(010101) || n.is_multiple_of(001001)
5645
}
46+
1000000..=9999999 => n.is_multiple_of(1111111),
47+
10000000..=99999999 => {
48+
n.is_multiple_of(11111111) || n.is_multiple_of(01010101) || n.is_multiple_of(00010001)
49+
}
50+
100000000..=999999999 => n.is_multiple_of(111111111) || n.is_multiple_of(001001001),
51+
1000000000..=9999999999 => {
52+
n.is_multiple_of(1111111111)
53+
|| n.is_multiple_of(0101010101)
54+
|| n.is_multiple_of(0000100001)
55+
}
56+
_ => panic!(),
5757
}
58-
true
5958
}
6059

6160
fn sum_invalid(ranges: &[(u64, u64)], invalid: fn(u64) -> bool) -> u64 {

0 commit comments

Comments
 (0)