diff options
| author | nekineki <nekineki@nekineki.net> | 2024-12-17 16:08:35 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2024-12-17 16:08:35 +0100 |
| commit | edc36db81e83e419c9c39cbb778f95dab1cc3a54 (patch) | |
| tree | 83986fe793d6ee9d940254eec42405140958604c | |
| parent | c0c5dc6fafe94b18828bf52ab96d215c8c5d2ca1 (diff) | |
day17 part1
| -rw-r--r-- | 2024/day17.rs | 108 | ||||
| -rw-r--r-- | 2024/in/day17.pzl | 5 | ||||
| -rw-r--r-- | 2024/in/day17.ref | 5 |
3 files changed, 118 insertions, 0 deletions
diff --git a/2024/day17.rs b/2024/day17.rs new file mode 100644 index 0000000..cb21680 --- /dev/null +++ b/2024/day17.rs @@ -0,0 +1,108 @@ +#![allow(dead_code)] +#![allow(unused_variables)] +#![allow(unused_mut)] +use std::env; +use std::fs::File; +use std::io::Read; + +#[derive(Debug, PartialEq, Clone, Copy)] +struct State { + a: i64, + b: i64, + c: i64, + pc: usize, +} + +fn opcode(mut s: State, prog: &Vec<i64>, out: &mut Vec<i64>) -> State { + let op = prog[s.pc]; + let arg = prog[s.pc + 1]; + + let combo = match arg { + 0 => 0, + 1 => 1, + 2 => 2, + 3 => 3, + 4 => s.a, + 5 => s.b, + 6 => s.c, + 7 => panic!(), + _ => panic!(), + }; + + let mut jump = false; + match op { + 0 => s.a = s.a / (1 << combo), + 1 => s.b ^= arg, + 2 => s.b = combo % 8, + 3 => { + if s.a != 0 { + jump = true; + s.pc = arg as usize; + } + } + 4 => s.b ^= s.c, + 5 => out.push(combo % 8), + 6 => s.b = s.a / (1 << combo), + 7 => s.c = s.a / (1 << combo), + _ => panic!(), + } + + if jump == false { + s.pc += 2; + } + + return s; +} + +fn main() { + let args: Vec<String> = env::args().collect(); + let filename = if args.len() == 1 { + "in/".to_owned() + args[0].split('/').last().unwrap() + ".pzl" + } else { + args[1].clone() + }; + let mut f = File::open(filename).expect("cannot open file"); + let mut content = String::new(); + f.read_to_string(&mut content).expect("cannot read file"); + let lines = content.trim_end().split("\n").collect::<Vec<_>>(); + + let (l, r) = lines[0].split_once(": ").unwrap(); + let mut a: i64 = r.parse().unwrap(); + let (l, r) = lines[1].split_once(": ").unwrap(); + let mut b: i64 = r.parse().unwrap(); + let (l, r) = lines[2].split_once(": ").unwrap(); + let mut c: i64 = r.parse().unwrap(); + + let (l, r) = lines[4].split_once(": ").unwrap(); + let prog: Vec<i64> = r.split(",").map(|x| x.parse().unwrap()).collect(); + + let mut s = State { + a: a, + b: b, + c: c, + pc: 0, + }; + + let mut out: Vec<i64> = Vec::new(); + loop { + //println!("{:?} {:?}", s, out); + if s.pc + 1 >= prog.len() { + break; + } + s = opcode(s, &prog, &mut out); + } + //println!("{:?}", out); + + let res1 = out + .iter() + .map(|x| x.to_string()) + .collect::<Vec<_>>() + .join(","); + + let mut res2 = 0; + + println!("res1: {}", res1); + println!("res2: {}", res2); + assert_eq!(res1, "6,2,7,2,3,1,6,0,5"); + //assert_eq!(res2, ); +} diff --git a/2024/in/day17.pzl b/2024/in/day17.pzl new file mode 100644 index 0000000..4fbfac8 --- /dev/null +++ b/2024/in/day17.pzl @@ -0,0 +1,5 @@ +Register A: 47006051 +Register B: 0 +Register C: 0 + +Program: 2,4,1,3,7,5,1,5,0,3,4,3,5,5,3,0 diff --git a/2024/in/day17.ref b/2024/in/day17.ref new file mode 100644 index 0000000..f09839b --- /dev/null +++ b/2024/in/day17.ref @@ -0,0 +1,5 @@ +Register A: 729 +Register B: 0 +Register C: 0 + +Program: 0,1,5,4,3,0 |
