diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs index a41a05d..c210e9a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +#![allow(dead_code)] + use std::fs; fn read_file(file : &str) -> String { @@ -38,8 +40,56 @@ fn day1() { println!("1b: {}", sum2); } +fn run_program(input : Vec<usize>) -> Vec<usize> { + let mut mem = input.clone(); + for i in 0..mem.len()/4 { + let pos = i * 4; + let opcode = mem[pos]; + if opcode == 99 { + break; + } + + let op1 = mem[pos+1]; + let op2 = mem[pos+2]; + let op3 = mem[pos+3]; + match opcode { + 1 => { mem[op3] = mem[op1] + mem[op2]; } + 2 => { mem[op3] = mem[op1] * mem[op2]; } + _ => panic!("invalid opcode") + } + } + mem +} + +fn day2() { + let mut input = read_file("input2"); + input.pop(); + let mut program : Vec<usize> = input.split(',') + .map(|x| x.parse::<usize>().unwrap()) + .collect(); + + program[1] = 12; + program[2] = 2; + + let mem = run_program(program.clone()); + println!("2a: {}", mem[0]); + + for noun in 0..99 { + for verb in 0..99 { + program[1] = noun; + program[2] = verb; + let mem = run_program(program.clone()); + + if mem[0] == 19690720 { + println!("2b: {}", 100 * noun + verb); + return; + } + } + } +} + fn main() { - day1(); + day2(); } #[cfg(test)] @@ -57,4 +107,12 @@ mod tests { assert_eq!(required_fuel_with_fuel(1969), 966); assert_eq!(required_fuel_with_fuel(100756), 50346); } + + #[test] + fn test_day2() { + assert_eq!(run_program(vec!(1,0,0,0,99)), vec!(2,0,0,0,99)); + assert_eq!(run_program(vec!(2,3,0,3,99)), vec!(2,3,0,6,99)); + assert_eq!(run_program(vec!(2,4,4,5,99,0)), vec!(2,4,4,5,99,9801)); + assert_eq!(run_program(vec!(1,1,1,4,99,5,6,0,99)), vec!(30,1,1,4,2,5,6,0,99)); + } } |
