Guest User

Untitled

a guest
Dec 16th, 2025
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 4.31 KB | None | 0 0
  1. diff --git a/src/day02.rs b/src/day02.rs
  2. index c09c8ae..fabefae 100644
  3. --- a/src/day02.rs
  4. +++ b/src/day02.rs
  5. @@ -1,4 +1,3 @@
  6. -use std::cmp::max;
  7.  use std::collections::HashSet;
  8.  
  9.  pub fn parse(contents: &str) -> Vec<(u64, u64)> {
  10. @@ -14,6 +13,34 @@ fn num_digits(n: u64, b: u32) -> usize {
  11.      (0..).take_while(|i| (b as u64).pow(*i) <= n).count()
  12.  }
  13.  
  14. +// Returns the count of numbers with period `rep` between `id_start` and `id_end` (inclusive).
  15. +fn count_between(rep: usize, id_start: u64, id_end: u64) -> i128 {
  16. +    let digits_start = ((num_digits(id_start, 10) + (rep - 1)) / rep) as u32;
  17. +    let digits_end = (num_digits(id_end, 10) / rep) as u32;
  18. +    let mut count = 0;
  19. +    for digits in digits_start..=digits_end {
  20. +        let mut factor = 0;
  21. +        for r in 0..rep as u32 {
  22. +            factor += 10u64.pow(r * digits);
  23. +        }
  24. +
  25. +        let mut invalid_check_start = 10u64.pow(digits - 1).max(id_start / factor);
  26. +        if invalid_check_start * factor < id_start {
  27. +            invalid_check_start += 1;
  28. +        }
  29. +
  30. +        let end_invalid_ids = (10u64.pow(digits) - 1).min(id_end / factor);
  31. +        if end_invalid_ids < invalid_check_start {
  32. +            break;
  33. +        }
  34. +
  35. +        let n = end_invalid_ids - invalid_check_start;
  36. +        count += factor as i128
  37. +            * ((n as i128 + 1) * invalid_check_start as i128 + ((n as i128 * (n as i128 + 1)) / 2));
  38. +    }
  39. +    count
  40. +}
  41. +
  42.  // #[aoc(day2, part1)]
  43.  #[allow(dead_code)]
  44.  pub fn part_a(contents: &str) -> u64 {
  45. @@ -70,29 +97,11 @@ pub fn part_a_binary(contents: &str) -> u64 {
  46.  
  47.  #[aoc(day2, part1, smarter)]
  48.  // #[allow(dead_code)]
  49. -pub fn part_a_smarter(contents: &str) -> u128 {
  50. +pub fn part_a_smarter(contents: &str) -> i128 {
  51.      let vec = parse(contents);
  52.      let mut invalid_id_sum = 0;
  53.      for (id_start, id_end) in vec {
  54. -        let digits_start = (num_digits(id_start, 10) as f64 / 2.0).ceil() as usize;
  55. -        let digits_end = max(num_digits(id_end, 10) / 2, 1);
  56. -        for digits in digits_start..=digits_end {
  57. -            let factor = 10u64.pow(digits as u32) + 1;
  58. -
  59. -            let mut invalid_check_start = 10u64.pow(digits as u32 - 1).max(id_start / factor);
  60. -            while invalid_check_start * factor < id_start {
  61. -                invalid_check_start += 1;
  62. -            }
  63. -
  64. -            let end_invalid_ids = (10u64.pow(digits as u32) - 1).min(id_end / factor);
  65. -            if end_invalid_ids < invalid_check_start {
  66. -                continue;
  67. -            }
  68. -            let n = end_invalid_ids - invalid_check_start;
  69. -            invalid_id_sum += factor as u128
  70. -                * ((n + 1) as u128 * invalid_check_start as u128
  71. -                    + ((n as u128 * (n as u128 + 1)) / 2));
  72. -        }
  73. +        invalid_id_sum += count_between(2, id_start, id_end);
  74.      }
  75.      invalid_id_sum
  76.  }
  77. @@ -198,36 +207,7 @@ pub fn part_b_smarter(contents: &str) -> i128 {
  78.              continue;
  79.          }
  80.          for (id_start, id_end) in vec.iter() {
  81. -            if num_digits(*id_end, 10) < rep {
  82. -                continue;
  83. -            }
  84. -            let digits_start = (num_digits(*id_start, 10) as f64 / rep as f64).ceil() as usize;
  85. -            let digits_end = num_digits(*id_end, 10) / rep;
  86. -
  87. -            for digits in digits_start..=digits_end {
  88. -                let mut factor = 0;
  89. -
  90. -                for r in 0..rep {
  91. -                    factor += 10u64.pow(r as u32 * digits as u32);
  92. -                }
  93. -
  94. -                let mut invalid_check_start = 10u64.pow(digits as u32 - 1).max(*id_start / factor);
  95. -
  96. -                if invalid_check_start * factor < *id_start {
  97. -                    invalid_check_start += 1;
  98. -                }
  99. -
  100. -                let end_invalid_ids = (10u64.pow(digits as u32) - 1).min(id_end / factor);
  101. -
  102. -                if end_invalid_ids < invalid_check_start {
  103. -                    continue;
  104. -                }
  105. -                let n = end_invalid_ids - invalid_check_start;
  106. -                invalid_id_sum += sign as i128
  107. -                    * factor as i128
  108. -                    * ((n + 1) as i128 * invalid_check_start as i128
  109. -                        + ((n as i128 * (n as i128 + 1)) / 2));
  110. -            }
  111. +            invalid_id_sum += sign as i128 * count_between(rep, *id_start, *id_end);
  112.          }
  113.      }
  114.      invalid_id_sum
  115.  
Advertisement
Add Comment
Please, Sign In to add comment