Add day 10
This commit is contained in:
		| @@ -45,4 +45,8 @@ path = "src/day8/main.rs" | |||||||
| name = "day9" | name = "day9" | ||||||
| path = "src/day9/main.rs" | path = "src/day9/main.rs" | ||||||
|  |  | ||||||
|  | [[bin]] | ||||||
|  | name = "day10" | ||||||
|  | path = "src/day10/main.rs" | ||||||
|  |  | ||||||
| [dependencies] | [dependencies] | ||||||
|   | |||||||
							
								
								
									
										137
									
								
								day10.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								day10.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | |||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 5 | ||||||
|  | addx 3 | ||||||
|  | addx -2 | ||||||
|  | noop | ||||||
|  | addx 5 | ||||||
|  | addx 4 | ||||||
|  | noop | ||||||
|  | addx 3 | ||||||
|  | noop | ||||||
|  | addx 2 | ||||||
|  | addx -17 | ||||||
|  | addx 18 | ||||||
|  | addx 3 | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | addx 5 | ||||||
|  | noop | ||||||
|  | addx 1 | ||||||
|  | addx 2 | ||||||
|  | addx 5 | ||||||
|  | addx -40 | ||||||
|  | noop | ||||||
|  | addx 5 | ||||||
|  | addx 2 | ||||||
|  | addx 3 | ||||||
|  | noop | ||||||
|  | addx 2 | ||||||
|  | addx 3 | ||||||
|  | addx -2 | ||||||
|  | addx 2 | ||||||
|  | addx 2 | ||||||
|  | noop | ||||||
|  | addx 3 | ||||||
|  | addx 5 | ||||||
|  | addx 2 | ||||||
|  | addx 3 | ||||||
|  | addx -2 | ||||||
|  | addx 2 | ||||||
|  | addx -24 | ||||||
|  | addx 31 | ||||||
|  | addx 2 | ||||||
|  | addx -33 | ||||||
|  | addx -6 | ||||||
|  | addx 5 | ||||||
|  | addx 2 | ||||||
|  | addx 3 | ||||||
|  | noop | ||||||
|  | addx 2 | ||||||
|  | addx 3 | ||||||
|  | noop | ||||||
|  | addx 2 | ||||||
|  | addx -1 | ||||||
|  | addx 6 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 1 | ||||||
|  | addx 4 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx -15 | ||||||
|  | addx 20 | ||||||
|  | noop | ||||||
|  | addx -23 | ||||||
|  | addx 27 | ||||||
|  | noop | ||||||
|  | addx -35 | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 5 | ||||||
|  | addx 11 | ||||||
|  | addx -10 | ||||||
|  | addx 4 | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | addx 2 | ||||||
|  | addx 2 | ||||||
|  | noop | ||||||
|  | addx 3 | ||||||
|  | noop | ||||||
|  | addx 3 | ||||||
|  | addx 2 | ||||||
|  | noop | ||||||
|  | addx 3 | ||||||
|  | addx 2 | ||||||
|  | addx 11 | ||||||
|  | addx -4 | ||||||
|  | addx 2 | ||||||
|  | addx -38 | ||||||
|  | addx -1 | ||||||
|  | addx 2 | ||||||
|  | noop | ||||||
|  | addx 3 | ||||||
|  | addx 5 | ||||||
|  | addx 2 | ||||||
|  | addx -7 | ||||||
|  | addx 8 | ||||||
|  | addx 2 | ||||||
|  | addx 2 | ||||||
|  | noop | ||||||
|  | addx 3 | ||||||
|  | addx 5 | ||||||
|  | addx 2 | ||||||
|  | addx -25 | ||||||
|  | addx 26 | ||||||
|  | addx 2 | ||||||
|  | addx 8 | ||||||
|  | addx -1 | ||||||
|  | addx 2 | ||||||
|  | addx -2 | ||||||
|  | addx -37 | ||||||
|  | addx 5 | ||||||
|  | addx 3 | ||||||
|  | addx -1 | ||||||
|  | addx 5 | ||||||
|  | noop | ||||||
|  | addx 22 | ||||||
|  | addx -21 | ||||||
|  | addx 2 | ||||||
|  | addx 5 | ||||||
|  | addx 2 | ||||||
|  | addx 13 | ||||||
|  | addx -12 | ||||||
|  | addx 4 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 5 | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 2 | ||||||
|  | noop | ||||||
|  | addx 3 | ||||||
|  | noop | ||||||
|  | noop | ||||||
							
								
								
									
										146
									
								
								day10_test.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								day10_test.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | |||||||
|  | addx 15 | ||||||
|  | addx -11 | ||||||
|  | addx 6 | ||||||
|  | addx -3 | ||||||
|  | addx 5 | ||||||
|  | addx -1 | ||||||
|  | addx -8 | ||||||
|  | addx 13 | ||||||
|  | addx 4 | ||||||
|  | noop | ||||||
|  | addx -1 | ||||||
|  | addx 5 | ||||||
|  | addx -1 | ||||||
|  | addx 5 | ||||||
|  | addx -1 | ||||||
|  | addx 5 | ||||||
|  | addx -1 | ||||||
|  | addx 5 | ||||||
|  | addx -1 | ||||||
|  | addx -35 | ||||||
|  | addx 1 | ||||||
|  | addx 24 | ||||||
|  | addx -19 | ||||||
|  | addx 1 | ||||||
|  | addx 16 | ||||||
|  | addx -11 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 21 | ||||||
|  | addx -15 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx -3 | ||||||
|  | addx 9 | ||||||
|  | addx 1 | ||||||
|  | addx -3 | ||||||
|  | addx 8 | ||||||
|  | addx 1 | ||||||
|  | addx 5 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx -36 | ||||||
|  | noop | ||||||
|  | addx 1 | ||||||
|  | addx 7 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 2 | ||||||
|  | addx 6 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 7 | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | addx -13 | ||||||
|  | addx 13 | ||||||
|  | addx 7 | ||||||
|  | noop | ||||||
|  | addx 1 | ||||||
|  | addx -33 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 2 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 8 | ||||||
|  | noop | ||||||
|  | addx -1 | ||||||
|  | addx 2 | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | addx 17 | ||||||
|  | addx -9 | ||||||
|  | addx 1 | ||||||
|  | addx 1 | ||||||
|  | addx -3 | ||||||
|  | addx 11 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx -13 | ||||||
|  | addx -19 | ||||||
|  | addx 1 | ||||||
|  | addx 3 | ||||||
|  | addx 26 | ||||||
|  | addx -30 | ||||||
|  | addx 12 | ||||||
|  | addx -1 | ||||||
|  | addx 3 | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx -9 | ||||||
|  | addx 18 | ||||||
|  | addx 1 | ||||||
|  | addx 2 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 9 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx -1 | ||||||
|  | addx 2 | ||||||
|  | addx -37 | ||||||
|  | addx 1 | ||||||
|  | addx 3 | ||||||
|  | noop | ||||||
|  | addx 15 | ||||||
|  | addx -21 | ||||||
|  | addx 22 | ||||||
|  | addx -6 | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | addx 2 | ||||||
|  | addx 1 | ||||||
|  | noop | ||||||
|  | addx -10 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | addx 20 | ||||||
|  | addx 1 | ||||||
|  | addx 2 | ||||||
|  | addx 2 | ||||||
|  | addx -6 | ||||||
|  | addx -11 | ||||||
|  | noop | ||||||
|  | noop | ||||||
|  | noop | ||||||
							
								
								
									
										131
									
								
								src/day10/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								src/day10/main.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,131 @@ | |||||||
|  | use base::read_file; | ||||||
|  |  | ||||||
|  | struct CRT { | ||||||
|  |     display: [[char; 40]; 6], | ||||||
|  |     row_idx: usize, | ||||||
|  |     col_idx: usize, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl CRT { | ||||||
|  |     fn new() -> Self { | ||||||
|  |         Self { | ||||||
|  |             display: [['\0'; 40]; 6], | ||||||
|  |             col_idx: 0, | ||||||
|  |             row_idx: 0, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fn clock(&mut self, register: i32) { | ||||||
|  |         if self.col_idx >= 6 || self.row_idx >= 40 { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         let range = ((register - 1).max(0))..=((register + 1).min(39)); | ||||||
|  |         self.display[self.col_idx][self.row_idx] = if range.contains(&(self.row_idx as i32)) { '⭐' } else { '🌲' }; | ||||||
|  |  | ||||||
|  |         self.row_idx += 1; | ||||||
|  |         if self.row_idx % 40 == 0 { | ||||||
|  |             self.row_idx = 0; | ||||||
|  |             self.col_idx += 1; | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fn display(&self) { | ||||||
|  |         for col in 0..6 { | ||||||
|  |             for row in 0..40 { | ||||||
|  |                 print!("{}", self.display[col][row]); | ||||||
|  |             } | ||||||
|  |             println!(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[derive(Debug, Copy, Clone)] | ||||||
|  | enum Op { | ||||||
|  |     NOOP, | ||||||
|  |     ADD { | ||||||
|  |         amount: i32 | ||||||
|  |     }, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | struct Machine { | ||||||
|  |     program: Vec<Op>, | ||||||
|  |     register: i32, | ||||||
|  |     register_next: i32, | ||||||
|  |     instruction_counter: usize, | ||||||
|  |     instruction_left_counter: u32, | ||||||
|  |     current_option: Option<Op>, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Machine { | ||||||
|  |     fn new(program: Vec<Op>) -> Self { | ||||||
|  |         Self { | ||||||
|  |             program, | ||||||
|  |             register: 1, | ||||||
|  |             register_next: 1, | ||||||
|  |             instruction_counter: 0, | ||||||
|  |             instruction_left_counter: 0, | ||||||
|  |             current_option: None, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fn clock(&mut self, crt: &mut CRT) { | ||||||
|  |         self.register = self.register_next; | ||||||
|  |         crt.clock(self.register); | ||||||
|  |         if self.instruction_left_counter == 0 { | ||||||
|  |             if self.instruction_counter >= self.program.len() { | ||||||
|  |                 self.current_option = None; | ||||||
|  |                 self.instruction_left_counter = 0; | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             let next_op = self.program[self.instruction_counter]; | ||||||
|  |             self.instruction_counter += 1; | ||||||
|  |             match next_op { | ||||||
|  |                 Op::NOOP => { | ||||||
|  |                     self.instruction_left_counter = 0; | ||||||
|  |                 } | ||||||
|  |                 Op::ADD { .. } => { | ||||||
|  |                     self.instruction_left_counter = 1; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             self.current_option = Some(next_op); | ||||||
|  |         } else { | ||||||
|  |             if let Some(current_op) = self.current_option { | ||||||
|  |                 match current_op { | ||||||
|  |                     Op::NOOP => {} | ||||||
|  |                     Op::ADD { amount } => { self.register_next = self.register + amount; } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             self.instruction_left_counter -= 1; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | fn main() { | ||||||
|  |     let lines = read_file("day10.txt"); | ||||||
|  |     let mut ops = vec![]; | ||||||
|  |     for line in lines { | ||||||
|  |         if line.starts_with("noop") { ops.push(Op::NOOP); } else if line.starts_with("addx") { | ||||||
|  |             let amount = line.split_whitespace().collect::<Vec<_>>()[1].parse::<i32>().unwrap(); | ||||||
|  |             ops.push(Op::ADD { amount }); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     let mut crt = CRT::new(); | ||||||
|  |     let mut machine = Machine::new(ops); | ||||||
|  |  | ||||||
|  |     let mut signals = vec![]; | ||||||
|  |  | ||||||
|  |     for cycle in 0..2220 { | ||||||
|  |         machine.clock(&mut crt); | ||||||
|  |         let cycle = cycle + 1; | ||||||
|  |         match cycle { | ||||||
|  |             20 | 60 | 100 | 140 | 180 | 220 => { | ||||||
|  |                 signals.push(cycle * machine.register); | ||||||
|  |             } | ||||||
|  |             _ => {} | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     println!("Sum: {}", signals.iter().sum::<i32>()); | ||||||
|  |     crt.display(); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user