aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2019-12-02 19:04:48 +0100
committerReiner Herrmann <reiner@reiner-h.de>2019-12-02 19:13:53 +0100
commite5737096c5ae24b506df89327a8d41de368b4d35 (patch)
treeec1625449cce32ae8102757192a24142c9a1fd07
parentf34fa5fd3c5bc416331250a2e751166946903b95 (diff)
day2
-rw-r--r--input21
-rw-r--r--src/main.rs60
2 files changed, 60 insertions, 1 deletions
diff --git a/input2 b/input2
new file mode 100644
index 0000000..01733cc
--- /dev/null
+++ b/input2
@@ -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));
+ }
}