diff options
| -rw-r--r-- | input2 | 1 | ||||
| -rw-r--r-- | src/main.rs | 60 |
2 files changed, 60 insertions, 1 deletions
@@ -0,0 +1 @@ +1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,1,9,19,1,19,5,23,1,13,23,27,1,27,6,31,2,31,6,35,2,6,35,39,1,39,5,43,1,13,43,47,1,6,47,51,2,13,51,55,1,10,55,59,1,59,5,63,1,10,63,67,1,67,5,71,1,71,10,75,1,9,75,79,2,13,79,83,1,9,83,87,2,87,13,91,1,10,91,95,1,95,9,99,1,13,99,103,2,103,13,107,1,107,10,111,2,10,111,115,1,115,9,119,2,119,6,123,1,5,123,127,1,5,127,131,1,10,131,135,1,135,6,139,1,10,139,143,1,143,6,147,2,147,13,151,1,5,151,155,1,155,5,159,1,159,2,163,1,163,9,0,99,2,14,0,0 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)); + } } |
