This commit is contained in:
Martijn Gerritsen 2025-12-03 14:16:40 +01:00
parent baa97512d6
commit 2e51059d51
9 changed files with 296 additions and 54 deletions

View File

@ -13,3 +13,8 @@ harness = false
[[bench]] [[bench]]
name = "bench_aoc_2" name = "bench_aoc_2"
harness = false harness = false
[[bench]]
name = "bench_aoc_3"
harness = false
[dependencies]
strength_reduce = "0.2.4"

View File

@ -14,7 +14,14 @@ fn bench_aoc_1_part2(c: &mut Criterion) {
fn bench_aoc_1_part2_f(c: &mut Criterion) { fn bench_aoc_1_part2_f(c: &mut Criterion) {
let input = black_box(include_bytes!("../src/aoc/input/full_input_aoc1.txt")); let input = black_box(include_bytes!("../src/aoc/input/full_input_aoc1.txt"));
c.bench_function("bench_aoc2 part fast", |b| b.iter(|| aoc_1::solve_2f(input))); c.bench_function("bench_aoc2 part fast", |b| {
b.iter(|| aoc_1::solve_2f(input))
});
} }
criterion_group!(benches_p1, bench_aoc_1_part1, bench_aoc_1_part2, bench_aoc_1_part2_f); criterion_group!(
benches_p1,
bench_aoc_1_part1,
bench_aoc_1_part2,
bench_aoc_1_part2_f
);
criterion_main!(benches_p1); criterion_main!(benches_p1);

View File

@ -7,10 +7,29 @@ fn bench_aoc_2_part1(c: &mut Criterion) {
c.bench_function("bench_aoc2 part 1", |b| b.iter(|| aoc_2::solve_p1(input))); c.bench_function("bench_aoc2 part 1", |b| b.iter(|| aoc_2::solve_p1(input)));
} }
fn bench_aoc_2_part1_f(c: &mut Criterion) {
let input = black_box(include_str!("../src/aoc/input/full_input_aoc2.txt"));
c.bench_function("bench_aoc2 part 1 fast", |b| {
b.iter(|| aoc_2::solve_p1_unsafe(input))
});
}
fn bench_aoc_2_part1_faster(c: &mut Criterion) {
let input = black_box(include_bytes!("../src/aoc/input/full_input_aoc2.txt"));
c.bench_function("bench_aoc2 part 1 faster", |b| {
b.iter(|| aoc_2::solve_p1_bytes(input))
});
}
fn bench_aoc_2_part2(c: &mut Criterion) { fn bench_aoc_2_part2(c: &mut Criterion) {
let input = black_box(include_str!("../src/aoc/input/full_input_aoc2.txt")); let input = black_box(include_str!("../src/aoc/input/full_input_aoc2.txt"));
c.bench_function("bench_aoc2 part 1", |b| b.iter(|| aoc_2::solve_p2(input))); c.bench_function("bench_aoc2 part 1", |b| b.iter(|| aoc_2::solve_p2(input)));
} }
criterion_group!(benches_p2, bench_aoc_2_part1, bench_aoc_2_part2); criterion_group!(
benches_p2,
bench_aoc_2_part1,
bench_aoc_2_part1_f,
bench_aoc_2_part1_faster,
bench_aoc_2_part2
);
criterion_main!(benches_p2); criterion_main!(benches_p2);

35
benches/bench_aoc_3.rs Normal file
View File

@ -0,0 +1,35 @@
use aoc2025::aoc::aoc_3;
use criterion::{Criterion, criterion_group, criterion_main};
use std::hint::black_box;
fn bench_aoc_3_part1(c: &mut Criterion) {
let input = black_box(include_bytes!("../src/aoc/input/full_input_aoc3.txt"));
c.bench_function("bench_aoc3 part 1", |b| b.iter(|| aoc_3::solve_p1(input)));
}
fn bench_aoc_3_part1_fast(c: &mut Criterion) {
let input = black_box(include_bytes!("../src/aoc/input/full_input_aoc3.txt"));
c.bench_function("bench_aoc3 part 1 fast", |b| {
b.iter(|| aoc_3::solve_p1_fast(input))
});
}
fn bench_aoc_3_part2(c: &mut Criterion) {
let input = black_box(include_bytes!("../src/aoc/input/full_input_aoc3.txt"));
c.bench_function("bench_aoc3 part 2", |b| b.iter(|| aoc_3::solve_p2(input)));
}
fn bench_aoc_3_part2_fast(c: &mut Criterion) {
let input = black_box(include_bytes!("../src/aoc/input/full_input_aoc3.txt"));
c.bench_function("bench_aoc3 part 2 fast", |b| {
b.iter(|| aoc_3::solve_p2_fast(input))
});
}
criterion_group!(
benches_p3,
bench_aoc_3_part1,
bench_aoc_3_part1_fast,
bench_aoc_3_part2,
bench_aoc_3_part2_fast
);
criterion_main!(benches_p3);

View File

@ -1,2 +1,3 @@
pub mod aoc_1; pub mod aoc_1;
pub mod aoc_2; pub mod aoc_2;
pub mod aoc_3;

View File

@ -1,4 +1,3 @@
pub fn solve_1(input: &'static [u8]) -> u64 { pub fn solve_1(input: &'static [u8]) -> u64 {
let mut dial = 50; let mut dial = 50;
let mut answer = 0; let mut answer = 0;
@ -15,7 +14,6 @@ pub fn solve_1(input :&'static[u8]) -> u64 {
let ones = (line[2] & 0x0F) as i64; let ones = (line[2] & 0x0F) as i64;
tens * 10 + ones tens * 10 + ones
} else { } else {
let tens = (line[2] & 0x0F) as i64; let tens = (line[2] & 0x0F) as i64;
let ones = (line[3] & 0x0F) as i64; let ones = (line[3] & 0x0F) as i64;
tens * 10 + ones tens * 10 + ones
@ -29,7 +27,9 @@ pub fn solve_1(input :&'static[u8]) -> u64 {
if dial >= 100 { if dial >= 100 {
dial -= 100; dial -= 100;
} }
if dial == 0 { answer += 1 } if dial == 0 {
answer += 1
}
} }
answer answer
} }
@ -38,14 +38,16 @@ pub fn solve_1_f(input :&'static[u8]) -> u32 {
let mut dial = 50; let mut dial = 50;
let mut answer = 0; let mut answer = 0;
for line in input.split(|&b| b == b'\n') { for line in input.split(|&b| b == b'\n') {
let len = line.len(); let len = line.len();
let val = match len { let val = match len {
2 => line[1] as i64 - 48, 2 => line[1] as i64 - 48,
3 => 10 * line[1] as i64 + line[2] as i64 - 48 - 480, 3 => 10 * line[1] as i64 + line[2] as i64 - 48 - 480,
_ => {answer+=line[1] as u32 - 48; 10 * line[2] as i64 + line[ 3] as i64 - 48 - 480}, _ => {
answer += line[1] as u32 - 48;
10 * line[2] as i64 + line[3] as i64 - 48 - 480
}
}; };
if input[0] == b'R' { if input[0] == b'R' {
dial += val; dial += val;
@ -55,7 +57,9 @@ pub fn solve_1_f(input :&'static[u8]) -> u32 {
if dial >= 100 { if dial >= 100 {
dial -= 100; dial -= 100;
} }
if dial == 0 { answer += 1 } if dial == 0 {
answer += 1
}
} }
answer answer
} }
@ -74,12 +78,14 @@ pub fn solve_2(input :&'static[u8]) -> u64 {
let num = match bytes { let num = match bytes {
2 => input[index - 1] as i64 - 48, 2 => input[index - 1] as i64 - 48,
3 => 10 * input[index - 2] as i64 + input[index - 1] as i64 - 48 - 480, 3 => 10 * input[index - 2] as i64 + input[index - 1] as i64 - 48 - 480,
_ => {answer+=input[index-3] as u64 - 48; 10 * input[index -2] as i64 + input[index -1] as i64 - 48 - 480}, _ => {
answer += input[index - 3] as u64 - 48;
10 * input[index - 2] as i64 + input[index - 1] as i64 - 48 - 480
}
}; };
match input[index - bytes] { match input[index - bytes] {
b'L' => { b'L' => {
if num > dial { if num > dial {
if dial != 0 { if dial != 0 {
answer += 1; answer += 1;
@ -95,12 +101,9 @@ pub fn solve_2(input :&'static[u8]) -> u64 {
answer += 1; answer += 1;
dial = num + dial - 100; dial = num + dial - 100;
} else { } else {
dial = 0; dial = 0;
} }
} else { } else {
dial = num + dial; dial = num + dial;
} }
@ -128,13 +131,18 @@ pub fn solve_2f(input :&'static[u8]) -> u64 {
let val = match len { let val = match len {
2 => line[1] as i64 - 48, 2 => line[1] as i64 - 48,
3 => 10 * line[1] as i64 + line[2] as i64 - 48 - 480, 3 => 10 * line[1] as i64 + line[2] as i64 - 48 - 480,
_ => {answer+=line[1] as u64 - 48; 10 * line[2] as i64 + line[ 3] as i64 - 48 - 480}, _ => {
answer += line[1] as u64 - 48;
10 * line[2] as i64 + line[3] as i64 - 48 - 480
}
}; };
if line[0] == b'L' { if line[0] == b'L' {
let next_dial = dial - val; let next_dial = dial - val;
if next_dial < 0 { if next_dial < 0 {
if dial != 0 { answer += 1; } if dial != 0 {
answer += 1;
}
dial = next_dial + 100; dial = next_dial + 100;
} else { } else {
dial = next_dial; dial = next_dial;
@ -143,7 +151,9 @@ pub fn solve_2f(input :&'static[u8]) -> u64 {
// 'R' case // 'R' case
let next_dial = dial + val; let next_dial = dial + val;
if next_dial >= 100 { if next_dial >= 100 {
if next_dial != 100 { answer += 1; } if next_dial != 100 {
answer += 1;
}
dial = next_dial - 100; dial = next_dial - 100;
} else { } else {
dial = next_dial; dial = next_dial;

131
src/aoc/aoc_3.rs Normal file
View File

@ -0,0 +1,131 @@
pub fn solve_p1(input: &[u8]) -> u32 {
let mut answer = 0;
let mut i = 1;
let len = input.len();
while i < len {
let mut j = i;
let mut num = input[j-1];
let mut num2 = input[j];
while input[j+1] != 10 {
if input[j] > num {
num = input[j];
num2 = input[j + 1];
} else if input[j] > num2 {
num2 = input[j];
}
j +=1;
if j+2 == len {
break;
}
}
if input[j] > num2 {
num2 =input[j ];
}
answer += (((num - 48) * 10) + num2 - 48) as u32;
i = j + 3;
}
answer
}
pub fn solve_p1_fast(input: &[u8]) -> u32 {
let mut answer = 0;
let mut i = 1;
let len = input.len();
let mut num = input[0];
let mut num2 = input[1];
while i < len {
let mut j = i;
num = input[j-1];
num2 = input[j];
while input[j+1] != 10 {
if input[j] > num {
num = input[j];
num2 = input[j + 1];
} else if input[j] > num2 {
num2 = input[j];
}
j +=1;
if j+2 == len {
break;
}
}
if input[j] > num2 {
num2 =input[j ];
}
answer += (((num - 48) * 10) + num2 - 48) as u32;
i = j + 3;
}
answer
}
pub fn solve_p2(input: &[u8]) -> u64 {
let mut answer = 0;
for line in input.split(|&x| x == 10) {
let mut end = line.len() - 12;
let total = 12;
let mut start = 0;
let mut val = [0u8; 12];
for k in 0..total {
let mut num = line[start];
start += 1;
for i in start..=end {
if line[i] > num {
num = line[i];
start = i + 1;
}
}
val[k] = num;
end += 1;
}
let mut num = 0;
for i in 0..=11 {
num = num * 10 + (val[i] - 48) as u64;
}
answer += num;
}
answer
}
pub fn solve_p2_fast(input: &[u8]) -> u64 {
let mut answer = 0;
for line in input.split(|&x| x == 10) {
let mut end = line.len() - 12;
let total = 12;
let mut start = 0;
let mut val = [0u8; 12];
for k in 0..total {
let mut num = line[start];
start += 1;
for i in start..=end {
if line[i] > num {
num = line[i];
start = i + 1;
}
}
val[k] = num;
end += 1;
}
let mut num = 0;
for i in 0..=11 {
num = num * 10 + (val[i] - 48) as u64;
}
answer += num;
}
answer
}

View File

@ -0,0 +1,4 @@
987654321111111
811111111111119
234234234234278
818181911112111

View File

@ -1,35 +1,65 @@
pub mod aoc; pub mod aoc;
use crate::aoc::*; use crate::aoc::*;
fn main() { fn main() {
let input = include_str!("aoc/input/full_input_aoc2.txt"); let input = include_bytes!("aoc/input/full_input_aoc3.txt");
let answer = aoc_2::solve_p1(input); let answer = aoc_3::solve_p1(input);
println!("{}", answer);
let input2 = include_bytes!("aoc/input/full_input_aoc3.txt");
let answer = aoc_3::solve_p1_fast(input2);
println!("{}", answer); println!("{}", answer);
let input = include_bytes!("aoc/input/test_input_aoc2.txt");
//let answer = aoc_2::solve_p1_f(input);
println!("{:?}", input);
} }
#[test] #[test]
fn test_aoc_1_1() { fn test_aoc_1_1() {
assert_eq!(aoc_1::solve_1( include_bytes!("aoc/input/test_input_aoc1.txt")), 3); assert_eq!(
assert_eq!(aoc_1::solve_1( include_bytes!("aoc/input/full_input_aoc1.txt")), 1195); aoc_1::solve_1(include_bytes!("aoc/input/test_input_aoc1.txt")),
3
);
assert_eq!(
aoc_1::solve_1(include_bytes!("aoc/input/full_input_aoc1.txt")),
1195
);
} }
#[test] #[test]
fn test_aoc_1_2() { fn test_aoc_1_2() {
assert_eq!(aoc_1::solve_2f(include_bytes!("aoc/input/test_input_aoc1.txt")), 6); assert_eq!(
assert_eq!(aoc_1::solve_2f(include_bytes!("aoc/input/full_input_aoc1.txt")), 6770); aoc_1::solve_2f(include_bytes!("aoc/input/test_input_aoc1.txt")),
6
);
assert_eq!(
aoc_1::solve_2f(include_bytes!("aoc/input/full_input_aoc1.txt")),
6770
);
} }
#[test] #[test]
fn test_aoc_2_part1() { fn test_aoc_2_part1() {
assert_eq!(aoc_2::solve_p1(include_str!("aoc/input/test_input_aoc2.txt")), 1227775554); assert_eq!(
aoc_2::solve_p1(include_str!("aoc/input/test_input_aoc2.txt")),
1227775554
);
} }
#[test] #[test]
fn test_aoc_2_part2() { fn test_aoc_2_part2() {
assert_eq!(aoc_2::solve_p2(include_str!("aoc/input/test_input_aoc2.txt")), 4174379265); assert_eq!(
aoc_2::solve_p2(include_str!("aoc/input/test_input_aoc2.txt")),
4174379265
);
}
#[test]
fn test_aoc_3_part1() {
assert_eq!(
aoc_3::solve_p1(include_bytes!("aoc/input/full_input_aoc3.txt")),
17359
);
}
#[test]
fn test_aoc_3_part2() {
assert_eq!(
aoc_3::solve_p2_fast(include_bytes!("aoc/input/full_input_aoc3.txt")),
172787336861064
);
} }