Day 2 aoc in progress
This commit is contained in:
123
advent_of_code/2025/2/src/main.rs
Normal file
123
advent_of_code/2025/2/src/main.rs
Normal file
@@ -0,0 +1,123 @@
|
||||
use std::cmp::{max, min};
|
||||
|
||||
fn parse_input(input: &str) -> Vec<(i64, i64)> {
|
||||
let line = input.lines().next().unwrap();
|
||||
|
||||
line.split(",")
|
||||
.map(|id_range| {
|
||||
let mut id_range_iter = id_range.split("-");
|
||||
|
||||
(
|
||||
id_range_iter.next().unwrap().parse::<i64>().unwrap(),
|
||||
id_range_iter.next().unwrap().parse::<i64>().unwrap(),
|
||||
)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn solve_1(input: &str) -> i64 {
|
||||
let ranges = parse_input(input);
|
||||
|
||||
let mut result = 0;
|
||||
|
||||
for range in ranges {
|
||||
let min_length = range.0.to_string().len();
|
||||
let max_length = range.1.to_string().len();
|
||||
|
||||
for range_length in min_length..=max_length {
|
||||
if range_length % 2 == 0 {
|
||||
let mut range_start = max(range.0, 10_i64.pow(range_length as u32 - 1));
|
||||
let mut range_end = min(range.1, 10_i64.pow(range_length as u32) - 1);
|
||||
|
||||
let start_halves = range_start.to_string();
|
||||
let start_halves = start_halves.split_at(range_length / 2);
|
||||
let (start_first_half, start_second_half) = (
|
||||
start_halves.0.parse::<i64>().unwrap(),
|
||||
start_halves.1.parse::<i64>().unwrap(),
|
||||
);
|
||||
|
||||
if start_first_half < start_second_half {
|
||||
range_start = start_first_half + 1;
|
||||
} else {
|
||||
range_start = start_first_half;
|
||||
}
|
||||
|
||||
let end_halves = range_end.to_string();
|
||||
let end_halves = end_halves.split_at(range_length / 2);
|
||||
let (end_first_half, end_second_half) = (
|
||||
end_halves.0.parse::<i64>().unwrap(),
|
||||
end_halves.1.parse::<i64>().unwrap(),
|
||||
);
|
||||
|
||||
if end_first_half > end_second_half {
|
||||
range_end = end_first_half - 1;
|
||||
} else {
|
||||
range_end = end_first_half;
|
||||
}
|
||||
|
||||
for x in range_start..=range_end {
|
||||
result += x * 10_i64.pow(range_length as u32 / 2) + x;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
fn get_factors(n: i64) -> Vec<i64> {
|
||||
// Naive implementation, not counting n itself, but counting 1 always
|
||||
}
|
||||
|
||||
fn solve_2(input: &str) -> i64 {
|
||||
let ranges = parse_input(input);
|
||||
|
||||
let mut result = 0;
|
||||
|
||||
for range in ranges {
|
||||
let min_length = range.0.to_string().len();
|
||||
let max_length = range.1.to_string().len();
|
||||
|
||||
for range_length in min_length..=max_length {
|
||||
let range_start = max(range.0, 10_i64.pow(range_length as u32 - 1));
|
||||
let range_end = min(range.1, 10_i64.pow(range_length as u32) - 1);
|
||||
|
||||
let factors = get_factors(range_length);
|
||||
|
||||
for factor in factors {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("Hello, this is Patrick!");
|
||||
|
||||
let input = include_str!("../input.txt");
|
||||
|
||||
let result_1 = solve_1(input);
|
||||
println!("Sum of false ids: {}", result_1);
|
||||
|
||||
let result_2 = solve_2(input);
|
||||
println!("{}", result_2);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_1() {
|
||||
let test_input = include_str!("../test.txt");
|
||||
assert_eq!(solve_1(test_input), 1227775554);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_2() {
|
||||
let test_input = include_str!("../test.txt");
|
||||
assert_eq!(solve_2(test_input), 4174379265);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user