Day 10
This commit is contained in:
		
							
								
								
									
										7
									
								
								day10/Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								day10/Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| # This file is automatically @generated by Cargo. | ||||
| # It is not intended for manual editing. | ||||
| version = 3 | ||||
|  | ||||
| [[package]] | ||||
| name = "day10" | ||||
| version = "0.1.0" | ||||
							
								
								
									
										143
									
								
								day10/input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								day10/input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,143 @@ | ||||
| addx 2 | ||||
| addx 3 | ||||
| noop | ||||
| noop | ||||
| addx 1 | ||||
| addx 5 | ||||
| addx -1 | ||||
| addx 5 | ||||
| addx 1 | ||||
| noop | ||||
| noop | ||||
| addx 4 | ||||
| noop | ||||
| noop | ||||
| addx 5 | ||||
| addx -5 | ||||
| addx 6 | ||||
| addx 3 | ||||
| addx 1 | ||||
| addx 5 | ||||
| addx 1 | ||||
| noop | ||||
| addx -38 | ||||
| addx 41 | ||||
| addx -22 | ||||
| addx -14 | ||||
| addx 7 | ||||
| noop | ||||
| noop | ||||
| addx 3 | ||||
| addx -2 | ||||
| addx 2 | ||||
| noop | ||||
| addx 17 | ||||
| addx -12 | ||||
| addx 5 | ||||
| addx 2 | ||||
| addx -16 | ||||
| addx 17 | ||||
| addx 2 | ||||
| addx 5 | ||||
| addx 2 | ||||
| addx -30 | ||||
| noop | ||||
| addx -6 | ||||
| addx 1 | ||||
| noop | ||||
| addx 5 | ||||
| noop | ||||
| noop | ||||
| noop | ||||
| addx 5 | ||||
| addx -12 | ||||
| addx 17 | ||||
| noop | ||||
| noop | ||||
| noop | ||||
| noop | ||||
| addx 5 | ||||
| addx 10 | ||||
| addx -9 | ||||
| addx 2 | ||||
| addx 5 | ||||
| addx 2 | ||||
| addx -5 | ||||
| addx 6 | ||||
| addx 4 | ||||
| noop | ||||
| noop | ||||
| addx -37 | ||||
| noop | ||||
| noop | ||||
| addx 17 | ||||
| addx -12 | ||||
| addx 30 | ||||
| addx -23 | ||||
| addx 2 | ||||
| noop | ||||
| addx 3 | ||||
| addx -17 | ||||
| addx 22 | ||||
| noop | ||||
| noop | ||||
| noop | ||||
| addx 5 | ||||
| noop | ||||
| addx -10 | ||||
| addx 11 | ||||
| addx 4 | ||||
| noop | ||||
| addx 5 | ||||
| addx -2 | ||||
| noop | ||||
| addx -6 | ||||
| addx -29 | ||||
| addx 37 | ||||
| addx -30 | ||||
| addx 27 | ||||
| addx -2 | ||||
| addx -22 | ||||
| noop | ||||
| addx 3 | ||||
| addx 2 | ||||
| noop | ||||
| addx 7 | ||||
| addx -2 | ||||
| addx 2 | ||||
| addx 5 | ||||
| addx -5 | ||||
| addx 6 | ||||
| addx 2 | ||||
| addx 2 | ||||
| addx 5 | ||||
| addx -25 | ||||
| noop | ||||
| addx -10 | ||||
| noop | ||||
| addx 1 | ||||
| noop | ||||
| addx 2 | ||||
| noop | ||||
| noop | ||||
| noop | ||||
| noop | ||||
| addx 7 | ||||
| addx 1 | ||||
| addx 4 | ||||
| addx 1 | ||||
| noop | ||||
| addx 2 | ||||
| noop | ||||
| addx 3 | ||||
| addx 5 | ||||
| addx -1 | ||||
| noop | ||||
| addx 3 | ||||
| addx 5 | ||||
| addx 2 | ||||
| addx 1 | ||||
| noop | ||||
| noop | ||||
| noop | ||||
| noop | ||||
| @@ -1,3 +1,84 @@ | ||||
| fn main() { | ||||
|     println!("Hello, world!"); | ||||
| use std::fs::read_to_string; | ||||
|  | ||||
| type Register = i32; | ||||
|  | ||||
| enum Instruction { | ||||
|     Noop, | ||||
|     Addx(Register), | ||||
|     Addx2(Register), | ||||
| } | ||||
|  | ||||
| impl From<&str> for Instruction { | ||||
|     fn from(value: &str) -> Self { | ||||
|         match &value.split_whitespace().collect::<Vec<_>>()[..] { | ||||
|             ["addx", v] => Self::Addx(v.parse::<Register>().unwrap()), | ||||
|             ["noop"] => Self::Noop, | ||||
|             _ => panic!("Invalid instruction"), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| struct Cpu<T> { | ||||
|     instruction: Option<Instruction>, | ||||
|     x: Register, | ||||
|     instructions: T, | ||||
| } | ||||
|  | ||||
| impl<T> Cpu<T> { | ||||
|     fn new(instructions: T) -> Self { | ||||
|         Self { | ||||
|             instruction: Some(Instruction::Noop), | ||||
|             x: 1, | ||||
|             instructions, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl<T> Iterator for Cpu<T> | ||||
| where | ||||
|     T: Iterator<Item = Instruction>, | ||||
| { | ||||
|     type Item = Register; | ||||
|  | ||||
|     fn next(&mut self) -> Option<Self::Item> { | ||||
|         match self.instruction { | ||||
|             Some(Instruction::Noop) => self.instruction = self.instructions.next(), | ||||
|             Some(Instruction::Addx(v)) => self.instruction = Some(Instruction::Addx2(v)), | ||||
|             Some(Instruction::Addx2(v)) => { | ||||
|                 self.x += v; | ||||
|                 self.instruction = self.instructions.next() | ||||
|             } | ||||
|             None => return None, | ||||
|         } | ||||
|         Some(self.x) | ||||
|     } | ||||
| } | ||||
|  | ||||
| fn main() { | ||||
|     let input = "addx 15\naddx -11\naddx 6\naddx -3\naddx 5\naddx -1\naddx -8\naddx 13\naddx 4\nnoop\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx -35\naddx 1\naddx 24\naddx -19\naddx 1\naddx 16\naddx -11\nnoop\nnoop\naddx 21\naddx -15\nnoop\nnoop\naddx -3\naddx 9\naddx 1\naddx -3\naddx 8\naddx 1\naddx 5\nnoop\nnoop\nnoop\nnoop\nnoop\naddx -36\nnoop\naddx 1\naddx 7\nnoop\nnoop\nnoop\naddx 2\naddx 6\nnoop\nnoop\nnoop\nnoop\nnoop\naddx 1\nnoop\nnoop\naddx 7\naddx 1\nnoop\naddx -13\naddx 13\naddx 7\nnoop\naddx 1\naddx -33\nnoop\nnoop\nnoop\naddx 2\nnoop\nnoop\nnoop\naddx 8\nnoop\naddx -1\naddx 2\naddx 1\nnoop\naddx 17\naddx -9\naddx 1\naddx 1\naddx -3\naddx 11\nnoop\nnoop\naddx 1\nnoop\naddx 1\nnoop\nnoop\naddx -13\naddx -19\naddx 1\naddx 3\naddx 26\naddx -30\naddx 12\naddx -1\naddx 3\naddx 1\nnoop\nnoop\nnoop\naddx -9\naddx 18\naddx 1\naddx 2\nnoop\nnoop\naddx 9\nnoop\nnoop\nnoop\naddx -1\naddx 2\naddx -37\naddx 1\naddx 3\nnoop\naddx 15\naddx -21\naddx 22\naddx -6\naddx 1\nnoop\naddx 2\naddx 1\nnoop\naddx -10\nnoop\nnoop\naddx 20\naddx 1\naddx 2\naddx 2\naddx -6\naddx -11\nnoop\nnoop\nnoop"; | ||||
|     let input = read_to_string("input.txt").unwrap_or_else(|_| input.to_owned()); | ||||
|     let instructions = input.lines().map(Instruction::from); | ||||
|     let signal_strength: Register = Cpu::new(instructions) | ||||
|         .enumerate() | ||||
|         .map(|(i, x)| { | ||||
|             let i = i as Register; | ||||
|             let horizontal = i % 40; | ||||
|             print!( | ||||
|                 "{}", | ||||
|                 if (horizontal - x).abs() <= 1 { | ||||
|                     '█' | ||||
|                 } else { | ||||
|                     ' ' | ||||
|                 } | ||||
|             ); | ||||
|             if horizontal == 39 { | ||||
|                 println!(); | ||||
|             } | ||||
|             (i, x) | ||||
|         }) | ||||
|         .skip(19) | ||||
|         .step_by(40) | ||||
|         .map(|(i, x)| (i + 1) * x) | ||||
|         .sum(); | ||||
|     println!("signal strength: {signal_strength}"); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user