Day 2 part 2
This commit is contained in:
parent
9c74b744a8
commit
2be9fa8aba
2 changed files with 75 additions and 20 deletions
|
|
@ -10,3 +10,7 @@ bstr = "1.11.0"
|
|||
clap = { version = "4.5.21", features = ["derive"] }
|
||||
color-eyre = "0.6.3"
|
||||
humantime = "2.1.0"
|
||||
|
||||
[profile.release]
|
||||
debug = true
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
use std::time::Instant;
|
||||
use std::{collections::HashSet, time::Instant};
|
||||
|
||||
use aoc_2025::{load, print_res};
|
||||
use bstr::BString;
|
||||
|
|
@ -27,6 +27,55 @@ pub fn parsing(input: &BString) -> color_eyre::Result<Parsed<'_>> {
|
|||
.collect()
|
||||
}
|
||||
|
||||
fn id_sum(start: u64, end: u64, first_only: bool) -> u64 {
|
||||
let mut sum = 0;
|
||||
let mut seen = HashSet::new();
|
||||
|
||||
let mag = start.ilog10() + 1;
|
||||
|
||||
assert_eq!(
|
||||
mag,
|
||||
end.ilog10() + 1,
|
||||
"Only the same magnitude is supported"
|
||||
);
|
||||
|
||||
for part_len in (1..mag)
|
||||
.rev()
|
||||
.filter(|&part_len| mag.is_multiple_of(part_len))
|
||||
{
|
||||
let part_count = mag / part_len;
|
||||
let pow_part = 10u64.pow(part_len);
|
||||
|
||||
for part in (pow_part / 10)..pow_part {
|
||||
let mut id = 0;
|
||||
for _ in 0..part_count {
|
||||
id = id * pow_part + part;
|
||||
}
|
||||
|
||||
if id < start {
|
||||
continue;
|
||||
}
|
||||
|
||||
if id > end {
|
||||
break;
|
||||
}
|
||||
|
||||
if seen.contains(&id) {
|
||||
continue;
|
||||
}
|
||||
|
||||
seen.insert(id);
|
||||
sum += id;
|
||||
}
|
||||
|
||||
if first_only {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
sum
|
||||
}
|
||||
|
||||
#[inline(never)]
|
||||
pub fn part1(input: Parsed) {
|
||||
let mut invalid_id_sum = 0;
|
||||
|
|
@ -58,24 +107,7 @@ pub fn part1(input: Parsed) {
|
|||
panic!();
|
||||
}
|
||||
|
||||
let half_mag = mag_s / 2;
|
||||
let pow10 = 10u64.pow(half_mag);
|
||||
|
||||
let high_start = s / pow10;
|
||||
let high_end = e / pow10;
|
||||
|
||||
for invalid_part in high_start..=high_end {
|
||||
let invalid = invalid_part * pow10 + invalid_part;
|
||||
if invalid < start {
|
||||
continue
|
||||
}
|
||||
|
||||
if invalid > end {
|
||||
break
|
||||
}
|
||||
|
||||
invalid_id_sum += invalid;
|
||||
}
|
||||
invalid_id_sum += id_sum(s, e, true);
|
||||
}
|
||||
|
||||
print_res!("Sum of invalid IDs: {invalid_id_sum}");
|
||||
|
|
@ -83,7 +115,26 @@ pub fn part1(input: Parsed) {
|
|||
|
||||
#[inline(never)]
|
||||
pub fn part2(input: Parsed) {
|
||||
todo!("todo part2")
|
||||
let mut invalid_id_sum = 0;
|
||||
|
||||
for (start, end) in input {
|
||||
let mut s = start;
|
||||
let mag_e = end.ilog10() + 1;
|
||||
loop {
|
||||
let mag_s = s.ilog10() + 1;
|
||||
|
||||
if mag_s != mag_e {
|
||||
let next_start = 10u64.pow(mag_s);
|
||||
invalid_id_sum += id_sum(s, next_start - 1, false);
|
||||
s = next_start;
|
||||
} else {
|
||||
invalid_id_sum += id_sum(s, end, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print_res!("Sum of invalid IDs: {invalid_id_sum}");
|
||||
}
|
||||
|
||||
pub fn main() -> color_eyre::Result<()> {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue