feat: complete day 3
This commit is contained in:
		@@ -1,9 +1,55 @@
 | 
				
			|||||||
fn solve_part1(input: &str) -> i32 {
 | 
					fn solve_part1(input: &str) -> u32 {
 | 
				
			||||||
    todo!();
 | 
					    let (report, bit_len) = parse_input(input);
 | 
				
			||||||
 | 
					    let mut gamma: u32 = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for i in 0..bit_len {
 | 
				
			||||||
 | 
					        let count = report.iter().filter(|v| **v >> i & 0x01 == 0x01).count();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if count > report.len() - count {
 | 
				
			||||||
 | 
					            gamma |= 1 << i
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            gamma &= !(1 << i)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn solve_part2(input: &str) -> i32 {
 | 
					    gamma * (!gamma & ((1 << bit_len) - 1))
 | 
				
			||||||
    todo!();
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn solve_part2(input: &str) -> u32 {
 | 
				
			||||||
 | 
					    let (oxy_gen, bit_len) = parse_input(input);
 | 
				
			||||||
 | 
					    let co2_gen = oxy_gen.clone();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let left = part2_logic(oxy_gen, bit_len, true);
 | 
				
			||||||
 | 
					    let right = part2_logic(co2_gen, bit_len, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    left * right
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn part2_logic(mut gen: Vec<u16>, bit_len: usize, is_oxy: bool) -> u32 {
 | 
				
			||||||
 | 
					    for i in 0..bit_len {
 | 
				
			||||||
 | 
					        if gen.len() < 2 {
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let count = gen
 | 
				
			||||||
 | 
					            .iter()
 | 
				
			||||||
 | 
					            .filter(|v| **v >> (bit_len - 1 - i) & 0x01 == 0x01)
 | 
				
			||||||
 | 
					            .count();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let common = (count >= gen.len() - count) as u16;
 | 
				
			||||||
 | 
					        let needle = if is_oxy { 1 - common } else { common };
 | 
				
			||||||
 | 
					        gen.retain(|v| *v >> (bit_len - 1 - i) & 0x01 == needle);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gen[0] as u32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn parse_input(input: &str) -> (Vec<u16>, usize) {
 | 
				
			||||||
 | 
					    let mut it = input.lines().peekable();
 | 
				
			||||||
 | 
					    let size = it.peek().expect("1 > &str exists").len();
 | 
				
			||||||
 | 
					    let report = it.flat_map(|s| u16::from_str_radix(s, 2).ok()).collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (report, size)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn run(input: String) {
 | 
					pub fn run(input: String) {
 | 
				
			||||||
@@ -16,15 +62,16 @@ pub fn run(input: String) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#[cfg(test)]
 | 
					#[cfg(test)]
 | 
				
			||||||
mod tests {
 | 
					mod tests {
 | 
				
			||||||
    const EXAMPLE_INPUT: &str = todo!();
 | 
					    const EXAMPLE_INPUT: &str =
 | 
				
			||||||
 | 
					        "00100\n11110\n10110\n10111\n10101\n01111\n00111\n11100\n10000\n11001\n00010\n01010";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[test]
 | 
					    #[test]
 | 
				
			||||||
    fn part1() {
 | 
					    fn part1() {
 | 
				
			||||||
        todo!();
 | 
					        assert_eq!(super::solve_part1(EXAMPLE_INPUT), 198);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[test]
 | 
					    #[test]
 | 
				
			||||||
    fn part2() {
 | 
					    fn part2() {
 | 
				
			||||||
        todo!();
 | 
					        assert_eq!(super::solve_part2(EXAMPLE_INPUT), 230);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user