day-08.rs (1652B)
1 fn main() { 2 let input = std::fs::read_to_string("input.txt") 3 .unwrap() 4 .trim() 5 .chars() 6 .map(|op| op.to_digit(10).unwrap() as usize) 7 .collect::<Vec<usize>>(); 8 println!("Rust:"); 9 println!("Part 1: {}", part_1(&input)); 10 println!("Part 2: "); 11 part_2(&input); 12 } 13 14 fn part_1(input: &Vec<usize>) -> usize { 15 let width = 25; 16 let height = 6; 17 let num_layer = input.len() / (width * height); 18 let mut num_0 = vec![0; num_layer]; 19 let mut num_1 = vec![0; num_layer]; 20 let mut num_2 = vec![0; num_layer]; 21 22 input.iter().enumerate().for_each(|(i, val)| { 23 let layer = i / (width * height); 24 match val { 25 0 => num_0[layer] += 1, 26 1 => num_1[layer] += 1, 27 2 => num_2[layer] += 1, 28 _ => unreachable!(), 29 } 30 }); 31 32 let min_0_layer = num_0 33 .iter() 34 .enumerate() 35 .min_by_key(|&(_, value)| value) 36 .unwrap() 37 .0; 38 39 num_1[min_0_layer] * num_2[min_0_layer] 40 } 41 42 fn part_2(input: &Vec<usize>) { 43 let width = 25; 44 let height = 6; 45 let num_layer = input.len() / (width * height); 46 let mut image = vec![2; width * height]; 47 48 for i in 0..image.len() { 49 // Find first non-transparent cell. 50 let mut layer = 0; 51 while image[i] == 2 && layer < num_layer { 52 image[i] = input[layer * width * height + i]; 53 layer += 1; 54 } 55 } 56 57 image.chunks_exact(width).for_each(|line| { 58 line.iter().for_each(|x| match x { 59 1 => print!("██"), 60 _ => print!(" "), 61 }); 62 println!(""); 63 }); 64 }