diff --git a/src/day6.rs b/src/day6.rs index b917f42..57f8186 100644 --- a/src/day6.rs +++ b/src/day6.rs @@ -44,48 +44,31 @@ fn parse(input: &str, cephalopod_style: bool) -> Vec<(Vec, Operator)> { } problems.push( (0..rows.len()) - .map(|row| &rows[row][beginning_of_last_problem..col]) + .map(|row| rows[row][beginning_of_last_problem..col].to_vec()) .collect_vec(), ); beginning_of_last_problem = col + 1; } - let mut parsed_problems = vec![]; - - for problem in problems { + let parsed_problems = problems.into_iter().map(|problem| { let operands = if !cephalopod_style { - problem[..problem.len() - 1] - .iter() - .map(|chars| { - chars - .iter() - .collect::() - .trim_ascii() - .parse() - .unwrap() - }) - .collect_vec() + problem[..problem.len() - 1].to_vec() } else { - let transposed = spatial::transpose(&problem[..problem.len() - 1]); - - transposed - .into_iter() - .map(|line| line.iter().collect::().trim().parse().unwrap()) - .collect_vec() - }; + spatial::transpose(&problem[..problem.len() - 1]) + } + .iter() + .map(|line| line.iter().collect::().trim().parse().unwrap()) + .collect(); - let operator = problem[problem.len() - 1] - .iter() - .collect::() - .trim_ascii() - .to_owned(); - let operator = match operator.as_str() { + let operator = problem[problem.len() - 1].iter().collect::(); + let operator = match operator.trim() { "+" => Operator::Plus, "*" => Operator::Times, _ => unreachable!("{operator}"), }; - parsed_problems.push((operands, operator)); - } - parsed_problems + (operands, operator) + }); + + parsed_problems.collect() } diff --git a/src/spatial.rs b/src/spatial.rs index fe1252c..e841cc4 100644 --- a/src/spatial.rs +++ b/src/spatial.rs @@ -71,13 +71,8 @@ fn adjacent_ordinal(grid: &[Vec], coords: Point) -> [Option; 4] { retval } -pub fn transpose(input: &[&[T]]) -> Vec> { - let mut output = vec![vec![Default::default(); input.len()]; input[0].len()]; - - for col in 0..input[0].len() { - for row in 0..input.len() { - output[col][row] = input[row][col] - } - } - output +pub fn transpose, T: Copy>(input: &[S]) -> Vec> { + (0..input[0].as_ref().len()) + .map(|col| input.iter().map(|row| row.as_ref()[col]).collect()) + .collect() }