diff --git a/test.py b/test.py new file mode 100644 index 0000000..8790f7c --- /dev/null +++ b/test.py @@ -0,0 +1,26 @@ +# JS sucks +for line in open('./y2024/resources/17_input.txt'): + if line.startswith('Program:'): + instructions = list(map(int, line.split(': ')[1].split(','))) + +def outFromA(a): + interim = (a % 8) ^ 3 + c = a // (2 ** interim) + postC = c ^ 6 + return (postC ^ (a % 8)) % 8 + +candidates = [0] +for i in range(len(instructions) - 1, -1, -1): + newCandidates = [] + # print(f'Instruction: {instructions[i]}, candidates: {candidates}') + for c in candidates: + for j in range(8): + num = (c << 3) + j + out = outFromA(num) + # print(f'Num: {num}, Out: {out}, Instruction: {instructions[i]}') + if out == instructions[i]: + newCandidates.append(num) + candidates = newCandidates + +# print(candidates) +print(min(candidates)) diff --git a/y2024/src/days/d17.rs b/y2024/src/days/d17.rs index b3e248b..ec7cfa8 100644 --- a/y2024/src/days/d17.rs +++ b/y2024/src/days/d17.rs @@ -63,17 +63,22 @@ pub fn process_part2(input: &str) -> u32 { .collect_vec() .concat(); let mut a = 0; - loop { - registers.insert("A", a); - let out = exec_program(instructions.clone(), &mut registers); - if out == orig { - println!("{orig:?}"); - println!("{out:?}"); - break; - } - a += 1; - } + for idx in 1..=orig.len() { + let target = orig[orig.len() - idx..].to_vec(); + let mut new_a = a << 3; + loop { + registers.insert("A", new_a); + let out = exec_program(instructions.clone(), &mut registers); + println!("target {target:?}"); + println!("output {out:?}"); + if out == target { + a = new_a; + break; + } + new_a += 1; + } + } a }