diff --git a/Cargo.toml b/Cargo.toml index 4f45be0..5950313 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,10 @@ harness = false name = "bench_aoc_5" harness = false +[[bench]] +name = "bench_aoc_6" +harness = false + [dependencies] [profile.bench] opt-level = 3 diff --git a/benches/bench_aoc_6.rs b/benches/bench_aoc_6.rs new file mode 100644 index 0000000..bec7e17 --- /dev/null +++ b/benches/bench_aoc_6.rs @@ -0,0 +1,22 @@ +use std::hint::black_box; +use criterion::{criterion_group, criterion_main, Criterion}; +use aoc2025::aoc::aoc_6; + +fn bench_aoc_6_part1(c: &mut Criterion) { + let input = black_box(include_str!("../src/aoc/input/full_input_aoc5.txt")); + c.bench_function("bench_aoc6 part 1", |b| b.iter(|| aoc_6::solve_p1(input))); +} + +fn bench_aoc_6_part2(c: &mut Criterion) { + let input = black_box(include_str!("../src/aoc/input/full_input_aoc5.txt")); + c.bench_function("bench_aoc6 part 2", |b| b.iter(|| aoc_6::solve_p2(input))); +} + + + +criterion_group!( + benches_p6, + bench_aoc_6_part1, + bench_aoc_6_part2, +); +criterion_main!(benches_p6); \ No newline at end of file diff --git a/src/aoc.rs b/src/aoc.rs index a11d9e7..d6b0ff2 100644 --- a/src/aoc.rs +++ b/src/aoc.rs @@ -3,3 +3,4 @@ pub mod aoc_2; pub mod aoc_3; pub mod aoc_4; pub mod aoc_5; +pub mod aoc_6; diff --git a/src/aoc/aoc_6.rs b/src/aoc/aoc_6.rs new file mode 100644 index 0000000..8e6b846 --- /dev/null +++ b/src/aoc/aoc_6.rs @@ -0,0 +1,158 @@ +pub fn solve_p1(input: &str) -> u64 { + let mut answer = 0; + let lines = input.lines().count(); + let input = input.split_ascii_whitespace().collect::>(); +// println!("{:?}", input.len()/lines); + + let len = input.len()/lines; + for i in 0..len { + if input[i+(lines-1)*len] == "+" { + let mut sum = input[i].parse::().unwrap(); + for j in 1..lines-1{ + sum += input[i+ len* j].parse::().unwrap(); + } + answer += sum; + } else { + let mut product = input[i].parse::().unwrap(); + for j in 1..lines-1{ + product *= input[i+ len* j].parse::().unwrap(); + } + answer += product; + } + } + answer +} + +pub fn solve_p2(input: &str) -> u64 { + let mut answer = 0; + let lines = 4; + let input = input.lines().collect::>(); + //println!("{:?}", input); + let mut len = [0;5]; + for i in 0..lines{ + len[i] = input[i].len(); + } + + let max_idx = *len.iter().max().unwrap(); + + + let mut temp_ans = 0; + let mut start_idx = 0; + let mut op = false; + for i in 0..max_idx{ + if i == start_idx { + if input[4].chars().collect::>()[i] == '+'{ + op = false; + }else { + op = true; + } + } + + let mut num1 = ' '; + if i < len[0] { + num1 = input[0].chars().collect::>()[i]; + } + let mut num2 = ' '; + if i < len[1] { + num2 = input[1].chars().collect::>()[i]; + } + let mut num3 = ' '; + if i < len[2] { + num3 = input[2].chars().collect::>()[i]; + } + let mut num4 = ' '; + if i < len[3] { + num4 = input[3].chars().collect::>()[i]; + } + let full_num = format!("{}{}{}{}",num1 , num2 , num3, num4).trim().parse::().unwrap_or(0); + + if full_num != 0 { + if op { + if temp_ans != 0{ + temp_ans *= full_num; + } else { + temp_ans = full_num; + } + + } else { + temp_ans += full_num; + } + }else { + //println!("{}", temp_ans); + answer += temp_ans; + start_idx = i+1; + temp_ans = 0; + } + } + answer += temp_ans; + + + answer +} + +pub fn solve_p2_f(input: &str) -> u64 { + let mut answer = 0; + let lines = 4; + let input = input.lines().map(| x| {x.chars().collect()}).collect::>>(); + println!("{:?}", input); + let mut len = [0;5]; + for i in 0..lines{ + len[i] = input[i].len(); + } + + let max_idx = *len.iter().max().unwrap(); + + + let mut temp_ans = 0; + let mut start_idx = 0; + let mut op = false; + for i in 0..max_idx{ + if i == start_idx { + if input[4][i] == '+'{ + op = false; + }else { + op = true; + } + } + + let mut num1 = ' '; + if i < len[0] { + num1 = input[0][i]; + } + let mut num2 = ' '; + if i < len[1] { + num2 = input[1][i]; + } + let mut num3 = ' '; + if i < len[2] { + num3 = input[2][i]; + } + let mut num4 = ' '; + if i < len[3] { + num4 = input[3][i]; + } + let full_num = format!("{}{}{}{}",num1 , num2 , num3, num4).trim().parse::().unwrap_or(0); + + if full_num != 0 { + if op { + if temp_ans != 0{ + temp_ans *= full_num; + } else { + temp_ans = full_num; + } + + } else { + temp_ans += full_num; + } + }else { + //println!("{}", temp_ans); + answer += temp_ans; + start_idx = i+1; + temp_ans = 0; + } + } + answer += temp_ans; + + + answer +} \ No newline at end of file diff --git a/src/aoc/input/test_input_aoc6.txt b/src/aoc/input/test_input_aoc6.txt new file mode 100644 index 0000000..2465b9e --- /dev/null +++ b/src/aoc/input/test_input_aoc6.txt @@ -0,0 +1,4 @@ +123 328 51 64 + 45 64 387 23 + 6 98 215 314 +* + * + diff --git a/src/main.rs b/src/main.rs index e45d630..b7e65bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,13 +20,23 @@ fn main() { let answer = aoc_4::solve_p1(input); println!("{}", answer); */ + /* let input = include_str!("aoc/input/full_input_aoc5.txt"); let answer = aoc_5::solve_p1(input); println!("{}", answer); - let input = include_str!("aoc/input/full_input_aoc5.txt"); + let input = include_str!("aoc/input/test_input_aoc5.txt"); let answer = aoc_5::solve_p2(input); println!("{}", answer); + + */ + let input = include_str!("aoc/input/full_input_aoc6.txt"); + let answer = aoc_6::solve_p1(input); + println!("answer: {}", answer); + + let input = include_str!("aoc/input/full_input_aoc6.txt"); + let answer = aoc_6::solve_p2(input); + println!("answer: {}", answer); } #[test]