This commit is contained in:
2025-12-01 14:35:27 +01:00
parent c2d5545139
commit 601c7423b1
8 changed files with 4414 additions and 0 deletions

10
Cargo.lock generated
View File

@@ -178,3 +178,13 @@ dependencies = [
"regex", "regex",
"utils", "utils",
] ]
[[package]]
name = "y2025"
version = "0.1.0"
dependencies = [
"itertools",
"rayon",
"regex",
"utils",
]

View File

@@ -16,6 +16,7 @@ members = [
"y2022", "y2022",
"y2023", "y2023",
"y2024", "y2024",
"y2025",
] ]
[workspace.dependencies] [workspace.dependencies]

10
y2025/Cargo.toml Normal file
View File

@@ -0,0 +1,10 @@
[package]
name = "y2025"
version = "0.1.0"
edition = "2024"
[dependencies]
regex = "1.11.1"
utils = { workspace = true }
itertools = { workspace = true }
rayon = { workspace = true }

4269
y2025/resources/1_input.txt Normal file

File diff suppressed because it is too large Load Diff

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

@@ -0,0 +1,27 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2025::days::d1;
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/1_input.txt")).unwrap();
println!("{}", d1::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/1_input.txt")).unwrap();
println!("{}", d1::process_part2(&content));
}

95
y2025/src/days/d1.rs Normal file
View File

@@ -0,0 +1,95 @@
pub fn process_part1(input: &str) -> i32 {
let mut current = 50;
let mut zeroes = 0;
for line in input.lines() {
let (direction, distance) = line.split_at(1);
let distance = distance.parse::<i32>().unwrap() % 100;
match direction {
"L" => current -= distance,
"R" => current += distance,
_ => panic!("Invalid direction"),
};
if current < 0 {
current += 100;
} else if current > 99 {
current -= 100;
}
if current == 0 {
zeroes += 1;
}
}
return zeroes;
}
pub fn process_part2(input: &str) -> i32 {
let mut current = 50;
let mut zeroes = 0;
for line in input.lines() {
let is_zero = current == 0;
let (direction, distance) = line.split_at(1);
let distance = distance.parse::<i32>().unwrap();
let mut rotations = {
if direction == "L" {
if current - distance < 0 && !is_zero {
(current - distance).abs() / 100 + 1
} else if current - distance < 0 && is_zero {
(current - distance).abs() / 100
} else {
0
}
} else {
if current + distance > 99 {
(current + distance) / 100
} else {
0
}
}
};
match direction {
"L" => current -= distance % 100,
"R" => current += distance % 100,
_ => panic!("Invalid direction"),
};
if current < 0 {
current += 100;
} else if current > 99 {
current -= 100;
}
if current == 0 {
zeroes += 1;
if rotations > 0 {
rotations -= 1;
}
}
zeroes += rotations;
}
return zeroes;
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT: &str = "L68
L30
R48
L5
R60
L55
L1
L99
R14
L82";
#[test]
fn part1() {
let result = process_part1(INPUT);
assert_eq!(result, 3);
}
#[test]
fn part2() {
let result = process_part2(INPUT);
assert_eq!(result, 6);
}
}

1
y2025/src/days/mod.rs Normal file
View File

@@ -0,0 +1 @@
pub mod d1;

1
y2025/src/lib.rs Normal file
View File

@@ -0,0 +1 @@
pub mod days;