This commit is contained in:
2025-12-02 09:11:36 +01:00
parent 601c7423b1
commit ec22c94be0
4 changed files with 121 additions and 0 deletions

View File

@@ -0,0 +1 @@
8284583-8497825,7171599589-7171806875,726-1031,109709-251143,1039-2064,650391-673817,674522-857785,53851-79525,8874170-8908147,4197684-4326484,22095-51217,92761-107689,23127451-23279882,4145708930-4145757240,375283-509798,585093-612147,7921-11457,899998-1044449,3-19,35-64,244-657,5514-7852,9292905274-9292965269,287261640-287314275,70-129,86249864-86269107,5441357-5687039,2493-5147,93835572-94041507,277109-336732,74668271-74836119,616692-643777,521461-548256,3131219357-3131417388

27
y2025/src/bin/d2.rs Normal file
View File

@@ -0,0 +1,27 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2025::days::d2;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/2_input.txt")).unwrap();
println!("{}", d2::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/2_input.txt")).unwrap();
println!("{}", d2::process_part2(&content));
}

91
y2025/src/days/d2.rs Normal file
View File

@@ -0,0 +1,91 @@
use itertools::Itertools;
pub fn process_part1(input: &str) -> i64 {
input
.split(',')
.map(|range| range.split_once('-').unwrap())
.map(|(start, end)| {
(
start
.parse::<i64>()
.expect(&format!("Cannot parse start from {start}")),
end.trim_end()
.parse::<i64>()
.expect(&format!("Cannot parse end from {end}")),
)
})
.map(|(start, end)| {
(start..=end)
.map(|id| {
let id_str = format!("{id}");
if id_str.starts_with('0') {
return 0;
}
let (left, right) = id_str.split_at(id_str.len() / 2);
if left == right {
return id;
}
0
})
.sum::<i64>()
})
.sum()
}
pub fn process_part2(input: &str) -> i64 {
input
.split(',')
.map(|range| range.split_once('-').unwrap())
.map(|(start, end)| {
(
start
.parse::<i64>()
.expect(&format!("Cannot parse start from {start}")),
end.trim_end()
.parse::<i64>()
.expect(&format!("Cannot parse end from {end}")),
)
})
.map(|(start, end)| {
(start..=end)
.map(|id| {
let id_str = format!("{id}");
if id_str.starts_with('0') {
return 0;
}
for num_parts in 2..=id_str.len() {
let parts = id_str
.chars()
.chunks(id_str.len() / num_parts)
.into_iter()
.map(|chunk| chunk.collect::<String>())
.collect::<Vec<String>>();
if parts.iter().all_equal() {
return id;
}
}
0
})
.sum::<i64>()
})
.sum()
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT: &str = "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124";
#[test]
fn part1() {
let result = process_part1(INPUT);
assert_eq!(result, 1227775554);
}
#[test]
fn part2() {
let result = process_part2(INPUT);
assert_eq!(result, 4174379265);
}
}

View File

@@ -1 +1,3 @@
pub mod d1; pub mod d1;
pub mod d2;