day16: problem 2 solution
This commit is contained in:
		
							
								
								
									
										102
									
								
								16/src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								16/src/main.rs
									
									
									
									
									
								
							@@ -47,16 +47,6 @@ impl Display for FromDirection {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct Tile {
 | 
			
		||||
    kind: char,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<char> for Tile {
 | 
			
		||||
    fn from(c: char) -> Self {
 | 
			
		||||
        Tile { kind: c }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct Contraption {
 | 
			
		||||
    tiles: Vec<Vec<char>>,
 | 
			
		||||
}
 | 
			
		||||
@@ -66,8 +56,42 @@ struct VisitState {
 | 
			
		||||
    visited_rays: HashSet<((i64, i64), FromDirection)>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl VisitState {
 | 
			
		||||
    fn score(&self) -> u64 {
 | 
			
		||||
        self.energized.iter().flatten().filter(|c| **c).count() as u64
 | 
			
		||||
    }
 | 
			
		||||
    fn dump(&self) {
 | 
			
		||||
        println!("Score {}:", self.score());
 | 
			
		||||
        for line in &self.energized {
 | 
			
		||||
            println!(
 | 
			
		||||
                "  {}",
 | 
			
		||||
                String::from_iter(line.iter().map(|b| if *b { '#' } else { '.' }))
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
impl Contraption {
 | 
			
		||||
    fn cast_ray<'a>(
 | 
			
		||||
        &'a mut self,
 | 
			
		||||
        state: &'a mut VisitState,
 | 
			
		||||
        pos: (i64, i64),
 | 
			
		||||
        dir: FromDirection,
 | 
			
		||||
    ) {
 | 
			
		||||
        let mut new_rays = self.cast_ray_inner(state, pos, dir);
 | 
			
		||||
 | 
			
		||||
        loop {
 | 
			
		||||
            new_rays = new_rays
 | 
			
		||||
                .iter()
 | 
			
		||||
                .flat_map(|(pos, dir)| self.cast_ray_inner(state, *pos, *dir))
 | 
			
		||||
                .collect();
 | 
			
		||||
            if new_rays.len() == 0 {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    fn cast_ray_inner<'a>(
 | 
			
		||||
        &'a mut self,
 | 
			
		||||
        state: &'a mut VisitState,
 | 
			
		||||
        mut pos: (i64, i64),
 | 
			
		||||
@@ -148,42 +172,52 @@ impl<T: BufRead> From<Lines<T>> for Contraption {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn dump_state(state: &Vec<Vec<bool>>) {
 | 
			
		||||
    for line in state {
 | 
			
		||||
        println!(
 | 
			
		||||
            "{}",
 | 
			
		||||
            String::from_iter(line.iter().map(|b| if *b { '#' } else { '.' }))
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PROBLEM 1 solution
 | 
			
		||||
 | 
			
		||||
fn problem1<T: BufRead>(input: Lines<T>) -> u64 {
 | 
			
		||||
    let mut contraption = Contraption::from(input);
 | 
			
		||||
    let mut state = contraption.empty_state();
 | 
			
		||||
 | 
			
		||||
    let mut new_rays = contraption.cast_ray(&mut state, (0, 0), FromDirection::Left);
 | 
			
		||||
    for ray in &new_rays {
 | 
			
		||||
        println!("  {:?}", ray);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    loop {
 | 
			
		||||
        new_rays = new_rays
 | 
			
		||||
            .iter()
 | 
			
		||||
            .flat_map(|(pos, dir)| contraption.cast_ray(&mut state, *pos, *dir))
 | 
			
		||||
            .collect();
 | 
			
		||||
        if new_rays.len() == 0 {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    contraption.cast_ray(&mut state, (0,0), FromDirection::Left);
 | 
			
		||||
 | 
			
		||||
    state.energized.iter().flatten().filter(|c| **c).count() as u64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PROBLEM 2 solution
 | 
			
		||||
fn problem2<T: BufRead>(input: Lines<T>) -> u64 {
 | 
			
		||||
    0
 | 
			
		||||
    let mut contraption = Contraption::from(input);
 | 
			
		||||
    let mut max_tiles = 0u64;
 | 
			
		||||
 | 
			
		||||
    for y in 0..contraption.tiles.len() as i64 {
 | 
			
		||||
        let mut left_state = contraption.empty_state();
 | 
			
		||||
        contraption.cast_ray(&mut left_state, (0, y), FromDirection::Left);
 | 
			
		||||
        let mut right_state = contraption.empty_state();
 | 
			
		||||
        contraption.cast_ray(
 | 
			
		||||
            &mut right_state,
 | 
			
		||||
            (contraption.tiles[0].len() as i64 - 1, y),
 | 
			
		||||
            FromDirection::Right,
 | 
			
		||||
        );
 | 
			
		||||
        max_tiles = std::cmp::max(
 | 
			
		||||
            max_tiles,
 | 
			
		||||
            std::cmp::max(left_state.score(), right_state.score()),
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    for x in 0..contraption.tiles[0].len() as i64 {
 | 
			
		||||
        let mut top_state = contraption.empty_state();
 | 
			
		||||
        contraption.cast_ray(&mut top_state, (x, 0), FromDirection::Above);
 | 
			
		||||
        let mut bottom_state = contraption.empty_state();
 | 
			
		||||
        contraption.cast_ray(
 | 
			
		||||
            &mut bottom_state,
 | 
			
		||||
            (x, contraption.tiles.len() as i64 - 1),
 | 
			
		||||
            FromDirection::Below,
 | 
			
		||||
        );
 | 
			
		||||
        max_tiles = std::cmp::max(
 | 
			
		||||
            max_tiles,
 | 
			
		||||
            std::cmp::max(top_state.score(), bottom_state.score()),
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    max_tiles
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user