generated from janezicmatej/aoc-template
	solution: day 11
This commit is contained in:
		
							
								
								
									
										10
									
								
								data/examples/11.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								data/examples/11.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
...#......
 | 
			
		||||
.......#..
 | 
			
		||||
#.........
 | 
			
		||||
..........
 | 
			
		||||
......#...
 | 
			
		||||
.#........
 | 
			
		||||
.........#
 | 
			
		||||
..........
 | 
			
		||||
.......#..
 | 
			
		||||
#...#.....
 | 
			
		||||
							
								
								
									
										78
									
								
								src/bin/11.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								src/bin/11.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,78 @@
 | 
			
		||||
use std::collections::HashSet;
 | 
			
		||||
 | 
			
		||||
fn parse_input(input: &str) -> (Vec<(usize, usize)>, HashSet<usize>, HashSet<usize>) {
 | 
			
		||||
    let mut galaxies = Vec::new();
 | 
			
		||||
    let mut rows = HashSet::new();
 | 
			
		||||
    let mut columns = HashSet::from_iter(1..(input.lines().next().unwrap().len()));
 | 
			
		||||
 | 
			
		||||
    for (y, line) in input.lines().enumerate() {
 | 
			
		||||
        let mut found = false;
 | 
			
		||||
        for (x, c) in line.chars().enumerate() {
 | 
			
		||||
            if c == '#' {
 | 
			
		||||
                galaxies.push((y, x));
 | 
			
		||||
                found = true;
 | 
			
		||||
            }
 | 
			
		||||
            columns.remove(&x);
 | 
			
		||||
        }
 | 
			
		||||
        if !found {
 | 
			
		||||
            rows.insert(y);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    (galaxies, rows, columns)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn solve(input: &str, explode: usize) -> Option<usize> {
 | 
			
		||||
    let (galaxies, rows, columns) = parse_input(input);
 | 
			
		||||
 | 
			
		||||
    let mut counter = 0;
 | 
			
		||||
 | 
			
		||||
    for ((y1, x1), (y2, x2)) in galaxies
 | 
			
		||||
        .iter()
 | 
			
		||||
        .copied()
 | 
			
		||||
        .enumerate()
 | 
			
		||||
        .flat_map(|(i, x)| galaxies.iter().skip(i + 1).copied().map(move |y| (x, y)))
 | 
			
		||||
    {
 | 
			
		||||
        let y_abs = y1.abs_diff(y2);
 | 
			
		||||
        let x_abs = x1.abs_diff(x2);
 | 
			
		||||
        let x_extra = columns
 | 
			
		||||
            .iter()
 | 
			
		||||
            .filter(|x| (x1..=x2).contains(x) || (x2..=x1).contains(x))
 | 
			
		||||
            .count();
 | 
			
		||||
        let y_extra = rows
 | 
			
		||||
            .iter()
 | 
			
		||||
            .filter(|y| (y1..=y2).contains(y) || (y2..=y1).contains(y))
 | 
			
		||||
            .count();
 | 
			
		||||
        counter += x_abs + y_abs + (x_extra + y_extra) * (explode - 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Some(counter)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn part_one(input: &str) -> Option<usize> {
 | 
			
		||||
    solve(input, 2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn part_two(input: &str) -> Option<usize> {
 | 
			
		||||
    solve(input, 1_000_000)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
aoc::solution!(11);
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests {
 | 
			
		||||
    use super::*;
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_part_one() {
 | 
			
		||||
        assert_eq!(
 | 
			
		||||
            part_one(&aoc::template::read_file("examples", 11)),
 | 
			
		||||
            Some(374)
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_part_two() {
 | 
			
		||||
        let input = aoc::template::read_file("examples", 11);
 | 
			
		||||
        assert_eq!(solve(&input, 10), Some(1030));
 | 
			
		||||
        assert_eq!(solve(&input, 100), Some(8410));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user