generated from janezicmatej/aoc-template
	solution: day 13
This commit is contained in:
		
							
								
								
									
										15
									
								
								data/examples/13.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								data/examples/13.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					#.##..##.
 | 
				
			||||||
 | 
					..#.##.#.
 | 
				
			||||||
 | 
					##......#
 | 
				
			||||||
 | 
					##......#
 | 
				
			||||||
 | 
					..#.##.#.
 | 
				
			||||||
 | 
					..##..##.
 | 
				
			||||||
 | 
					#.#.##.#.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#...##..#
 | 
				
			||||||
 | 
					#....#..#
 | 
				
			||||||
 | 
					..##..###
 | 
				
			||||||
 | 
					#####.##.
 | 
				
			||||||
 | 
					#####.##.
 | 
				
			||||||
 | 
					..##..###
 | 
				
			||||||
 | 
					#....#..#
 | 
				
			||||||
							
								
								
									
										66
									
								
								src/bin/13.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								src/bin/13.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
				
			|||||||
 | 
					fn mirror_h(shape: &Vec<Vec<char>>, smudges: usize) -> Option<usize> {
 | 
				
			||||||
 | 
					    (1..shape.len())
 | 
				
			||||||
 | 
					        .filter(|&i| {
 | 
				
			||||||
 | 
					            shape
 | 
				
			||||||
 | 
					                .iter()
 | 
				
			||||||
 | 
					                .skip(i)
 | 
				
			||||||
 | 
					                .zip(shape.iter().take(i).rev())
 | 
				
			||||||
 | 
					                .map(|(x, y)| {
 | 
				
			||||||
 | 
					                    x.iter()
 | 
				
			||||||
 | 
					                        .zip(y.iter())
 | 
				
			||||||
 | 
					                        .map(|(xx, yy)| (xx != yy) as usize)
 | 
				
			||||||
 | 
					                        .sum::<usize>()
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					                .sum::<usize>()
 | 
				
			||||||
 | 
					                == smudges
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .max()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					fn mirror_v(shape: &Vec<Vec<char>>, smudges: usize) -> Option<usize> {
 | 
				
			||||||
 | 
					    let shape = (0..shape[0].len())
 | 
				
			||||||
 | 
					        .map(|col| (0..shape.len()).map(|row| shape[row][col]).collect())
 | 
				
			||||||
 | 
					        .collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mirror_h(&shape, smudges)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn solve(input: &str, smudges: usize) -> usize {
 | 
				
			||||||
 | 
					    input
 | 
				
			||||||
 | 
					        .split("\n\n")
 | 
				
			||||||
 | 
					        .map(|x| x.lines().map(|line| line.chars().collect()).collect())
 | 
				
			||||||
 | 
					        .map(|shape| {
 | 
				
			||||||
 | 
					            let v = mirror_v(&shape, smudges).unwrap_or_default();
 | 
				
			||||||
 | 
					            let h = mirror_h(&shape, smudges).unwrap_or_default();
 | 
				
			||||||
 | 
					            v + h * 100
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .sum()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn part_one(input: &str) -> Option<usize> {
 | 
				
			||||||
 | 
					    Some(solve(input, 0))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn part_two(input: &str) -> Option<usize> {
 | 
				
			||||||
 | 
					    Some(solve(input, 1))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					aoc::solution!(13);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(test)]
 | 
				
			||||||
 | 
					mod tests {
 | 
				
			||||||
 | 
					    use super::*;
 | 
				
			||||||
 | 
					    #[test]
 | 
				
			||||||
 | 
					    fn test_part_one() {
 | 
				
			||||||
 | 
					        assert_eq!(
 | 
				
			||||||
 | 
					            part_one(&aoc::template::read_file("examples", 13)),
 | 
				
			||||||
 | 
					            Some(405)
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    #[test]
 | 
				
			||||||
 | 
					    fn test_part_two() {
 | 
				
			||||||
 | 
					        assert_eq!(
 | 
				
			||||||
 | 
					            part_two(&aoc::template::read_file("examples", 13)),
 | 
				
			||||||
 | 
					            Some(400)
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user