aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs60
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));
+ }
}