//println!("regA={} regB={} regC={} {:?}", self.regA, self.regB, self.regC, self.out);
}
+ fn is_copy(&self) -> bool {
+ self.prgm.len() == self.out.len() &&
+ self.prgm.iter().zip(self.out.clone()).all(|(a, b)| *a == b)
+ }
+
+ fn reset(&mut self, regs: (u64, u64, u64)) {
+ self.regA = regs.0;
+ self.regB = regs.1;
+ self.regC = regs.2;
+ self.ptr = 0;
+ self.out = Vec::new();
+ }
+
fn print(&self) -> String {
let s: Vec<String> = self.out.iter()
.map(|v| v.to_string())
Ok(computer.print())
}
-fn run_part2(input: &str) -> Result<String, Box<dyn Error>> {
+fn run_part2(input: &str) -> Result<u64, Box<dyn Error>> {
println!("Running {} - part 2", get_day());
- let res = "".to_string();
- Ok(res)
+ let mut computer = Computer::new(input);
+ let mut regs = (computer.regA, computer.regB, computer.regC);
+ computer.run();
+ while !computer.is_copy() {
+ computer.reset(regs);
+ computer.regA += 1;
+ computer.run();
+ regs.0 += 1;
+ }
+ Ok(regs.0)
}
pub fn run(input: &str) -> Result<(), Box<dyn Error>> {
Register C: 0
Program: 0,1,5,4,3,0";
+ static TEXT_INPUT_6: &str = "\
+Register A: 2024
+Register B: 0
+Register C: 0
+
+Program: 0,3,5,4,3,0";
#[test]
fn test_part1() {
#[test]
fn test_part2() {
- assert_eq!("", run_part2(TEXT_INPUT_5).unwrap());
+ assert_eq!(117440, run_part2(TEXT_INPUT_6).unwrap());
}
}