]> aoc.elinar.fr Git - aoc_2024/commitdiff
Day17 - part 2 brute force, not sure it will work
authoralex <>
Tue, 17 Dec 2024 10:54:12 +0000 (11:54 +0100)
committeralex <>
Tue, 17 Dec 2024 10:54:12 +0000 (11:54 +0100)
src/day17.rs

index 9208ae0bb26341bf40f3f3fd01c22c20cc766cbc..a38e82c0cafb418598b9daee62be89572a123250 100644 (file)
@@ -73,6 +73,19 @@ impl Computer {
         //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())
@@ -89,11 +102,19 @@ fn run_part1(input: &str) -> Result<String, Box<dyn Error>> {
     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>> {
@@ -151,6 +172,12 @@ Register B: 0
 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() {
@@ -164,6 +191,6 @@ Program: 0,1,5,4,3,0";
 
     #[test]
     fn test_part2() {
-        assert_eq!("", run_part2(TEXT_INPUT_5).unwrap());
+        assert_eq!(117440, run_part2(TEXT_INPUT_6).unwrap());
     }
 }