@@ -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" ) ]
3233fn 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
6160fn sum_invalid ( ranges : & [ ( u64 , u64 ) ] , invalid : fn ( u64 ) -> bool ) -> u64 {
0 commit comments