Skip to content

Commit 5eed3f4

Browse files
committed
2025 Day 6 cleaned up
1 parent 33b6d73 commit 5eed3f4

File tree

2 files changed

+40
-60
lines changed

2 files changed

+40
-60
lines changed

src/bin/2025_06/main.rs

Lines changed: 34 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,49 @@
11
use aoc::{common, grid::Grid, io};
22

3+
enum Operation {
4+
Add,
5+
Multiply,
6+
}
7+
38
fn solve2(input: &str) -> usize {
4-
let mut grid = Grid::from_str_no_trim(input, |c| c);
5-
//grid.print();
6-
let max_l = grid.values.iter().map(|v| v.len()).max().unwrap_or(0);
7-
//dbg!(max_l);
8-
for val in grid.values.iter_mut() {
9-
val.resize(max_l, ' ');
10-
}
11-
grid.cols = max_l;
12-
//grid.print();
9+
let grid = Grid::from_str_no_trim(input, |c| c, &' ');
10+
grid.print();
1311
let grid2 = grid.rotate_clockwise();
14-
//grid2.print();
12+
grid2.print();
1513

1614
let mut ans = 0;
17-
let mut op_mul = false;
15+
let mut op = Operation::Add;
1816
let mut ret = 0;
1917
for val in grid2.values.iter() {
20-
let str = val.iter().collect::<String>();
21-
//println!("{}\n", str);
22-
if str.trim().is_empty() {
23-
//dbg!(ret);
24-
ans += ret;
18+
if val[0] == '+' {
19+
op = Operation::Add;
2520
ret = 0;
26-
op_mul = false;
27-
continue;
28-
}
29-
let x = if str.contains("*") {
30-
op_mul = true;
21+
} else if val[0] == '*' {
22+
op = Operation::Multiply;
3123
ret = 1;
32-
str[1..]
33-
.trim()
34-
.chars()
35-
.rev()
36-
.collect::<String>()
37-
.parse::<usize>()
38-
.unwrap()
39-
} else if str.contains("+") {
40-
op_mul = false;
41-
ret = 0;
42-
str[1..]
43-
.trim()
44-
.chars()
45-
.rev()
46-
.collect::<String>()
47-
.parse::<usize>()
48-
.unwrap()
49-
} else {
50-
str.trim()
51-
.chars()
52-
.rev()
53-
.collect::<String>()
54-
.parse::<usize>()
55-
.unwrap()
5624
};
57-
58-
//dbg!(x);
59-
if op_mul {
60-
ret *= x;
25+
if let Ok(number) = val
26+
.iter()
27+
.skip(1)
28+
.rev()
29+
.collect::<String>()
30+
.trim()
31+
.parse::<usize>()
32+
{
33+
//dbg!(number);
34+
match op {
35+
Operation::Add => ret += number,
36+
Operation::Multiply => ret *= number,
37+
}
6138
} else {
62-
ret += x;
39+
ans += ret;
6340
}
6441
}
6542
ans += ret;
6643
ans
6744
}
6845

69-
fn solve<const PART: usize>(input: &str) -> usize {
46+
fn solve1(input: &str) -> usize {
7047
let mut ans = 0;
7148
let mut nums_tot: Vec<Vec<usize>> = Vec::new();
7249
for line in input.lines() {
@@ -80,15 +57,15 @@ fn solve<const PART: usize>(input: &str) -> usize {
8057
match *op {
8158
"+" => {
8259
let mut ret = 0;
83-
for i in 0..nums_tot.len() {
84-
ret += nums_tot[i][j];
60+
for row in &nums_tot {
61+
ret += row[j];
8562
}
8663
ans += ret;
8764
}
8865
"*" => {
8966
let mut ret = 1;
90-
for i in 0..nums_tot.len() {
91-
ret *= nums_tot[i][j];
67+
for row in &nums_tot {
68+
ret *= row[j];
9269
}
9370
ans += ret;
9471
}
@@ -106,7 +83,7 @@ fn solve<const PART: usize>(input: &str) -> usize {
10683

10784
fn main() {
10885
if let Some(input) = common::get_input() {
109-
common::timed(&input, solve::<1>, true);
86+
common::timed(&input, solve1, true);
11087
common::timed(&input, solve2, false);
11188
}
11289
}
@@ -118,7 +95,7 @@ mod tests {
11895
#[test]
11996
fn test_samples() {
12097
let sample_input = "123 328 51 64\n 45 64 387 23\n 6 98 215 314\n* + * + ";
121-
assert_eq!(solve::<1>(sample_input), 4277556);
98+
assert_eq!(solve1(sample_input), 4277556);
12299
assert_eq!(solve2(sample_input), 3263827);
123100
}
124101
}

src/grid.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,16 @@ impl<T: std::fmt::Debug + Clone + Default + PartialEq + Hash> Grid<T> {
9090
}
9191

9292
#[must_use]
93-
pub fn from_str_no_trim(input: &str, f: fn(char) -> T) -> Self {
93+
pub fn from_str_no_trim(input: &str, f: fn(char) -> T, default_fill: &T) -> Self {
9494
let lines = input
9595
.split('\n')
9696
.filter(|l| !l.is_empty())
9797
.collect::<Vec<_>>();
98-
let mut grid = Grid::<T>::new(lines.len(), lines[0].len(), T::default());
98+
let max_col_len = lines.iter().map(|v| v.len()).max().unwrap_or(0);
99+
let mut grid = Grid::<T>::new(lines.len(), max_col_len, default_fill.clone());
99100
for (i, line) in lines.iter().enumerate() {
100-
let row = line.chars().map(f).collect::<Vec<_>>();
101+
let mut row = line.chars().map(f).collect::<Vec<_>>();
102+
row.resize(max_col_len, default_fill.clone());
101103
grid.set_row(i, row);
102104
}
103105
grid
@@ -277,6 +279,7 @@ impl<T: std::fmt::Debug + Clone + Default + PartialEq + Hash> Grid<T> {
277279
}
278280

279281
pub fn set_row(&mut self, i: usize, row_vals: Vec<T>) {
282+
assert!(row_vals.len() == self.cols);
280283
self.values[i] = row_vals;
281284
}
282285

0 commit comments

Comments
 (0)