Browse Source

Completed day 2

Tyler Hallada 4 years ago
parent
commit
4233663582
6 changed files with 130 additions and 1 deletions
  1. 1 1
      .gitignore
  2. 6 0
      day2/Cargo.lock
  3. 9 0
      day2/Cargo.toml
  4. 1 0
      day2/input/input.txt
  5. 1 0
      day2/input/test.txt
  6. 112 0
      day2/src/main.rs

day1/.gitignore → .gitignore

@@ -1,2 +1,2 @@
1
-/target
1
+**/target
2 2
 **/*.rs.bk

+ 6 - 0
day2/Cargo.lock

@@ -0,0 +1,6 @@
1
+# This file is automatically @generated by Cargo.
2
+# It is not intended for manual editing.
3
+[[package]]
4
+name = "day2"
5
+version = "0.1.0"
6
+

+ 9 - 0
day2/Cargo.toml

@@ -0,0 +1,9 @@
1
+[package]
2
+name = "day2"
3
+version = "0.1.0"
4
+authors = ["Tyler Hallada <tyler@hallada.net>"]
5
+edition = "2018"
6
+
7
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8
+
9
+[dependencies]

+ 1 - 0
day2/input/input.txt

@@ -0,0 +1 @@
1
+1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,1,10,19,1,6,19,23,2,23,6,27,2,6,27,31,2,13,31,35,1,10,35,39,2,39,13,43,1,43,13,47,1,6,47,51,1,10,51,55,2,55,6,59,1,5,59,63,2,9,63,67,1,6,67,71,2,9,71,75,1,6,75,79,2,79,13,83,1,83,10,87,1,13,87,91,1,91,10,95,2,9,95,99,1,5,99,103,2,10,103,107,1,107,2,111,1,111,5,0,99,2,14,0,0

+ 1 - 0
day2/input/test.txt

@@ -0,0 +1 @@
1
+1,9,10,3,2,3,11,0,99,30,40,50

+ 112 - 0
day2/src/main.rs

@@ -0,0 +1,112 @@
1
+use std::fs::File;
2
+use std::io::{self, prelude::*};
3
+
4
+const INPUT: &str = "input/input.txt";
5
+
6
+fn read_intcode(filename: &str) -> io::Result<Vec<i32>> {
7
+    let mut file = File::open(filename)?;
8
+    let mut intcode_string = String::new();
9
+    file.read_to_string(&mut intcode_string)?;
10
+    let intcode_string = intcode_string.trim().to_string();
11
+
12
+    Ok(intcode_string
13
+        .split(',')
14
+        .map(|code| code.parse().unwrap())
15
+        .collect())
16
+}
17
+
18
+fn run_intcode(intcode: &mut Vec<i32>) {
19
+    let mut pointer = 0;
20
+
21
+    loop {
22
+        match intcode[pointer] {
23
+            1 => {
24
+                let a = intcode[intcode[pointer + 1] as usize];
25
+                let b = intcode[intcode[pointer + 2] as usize];
26
+                let target = intcode[pointer + 3] as usize;
27
+                intcode[target] = a + b;
28
+            }
29
+            2 => {
30
+                let a = intcode[intcode[pointer + 1] as usize];
31
+                let b = intcode[intcode[pointer + 2] as usize];
32
+                let target = intcode[pointer + 3] as usize;
33
+                intcode[target] = a * b;
34
+            }
35
+            99 => {
36
+                break;
37
+            }
38
+            invalid => panic!("Invalid opcode: {}", invalid),
39
+        }
40
+
41
+        pointer += 4;
42
+    }
43
+}
44
+
45
+fn solve_part1() -> io::Result<i32> {
46
+    let mut intcode = read_intcode(INPUT)?;
47
+    intcode[1] = 12;
48
+    intcode[2] = 2;
49
+    run_intcode(&mut intcode);
50
+    Ok(intcode[0])
51
+}
52
+
53
+fn solve_part2() -> io::Result<i32> {
54
+    let original_intcode = read_intcode(INPUT)?;
55
+    for noun in 0..99 {
56
+        for verb in 0..99 {
57
+            let mut intcode = original_intcode.clone();
58
+            intcode[1] = noun;
59
+            intcode[2] = verb;
60
+            run_intcode(&mut intcode);
61
+            if intcode[0] == 19690720 {
62
+                return Ok(100 * noun + verb)
63
+            }
64
+        }
65
+    }
66
+    panic!("Could not find a noun and verb that produced the target value")
67
+}
68
+
69
+fn main() -> io::Result<()> {
70
+    println!("Part 1: {}", solve_part1()?);
71
+    println!("Part 2: {}", solve_part2()?);
72
+
73
+    Ok(())
74
+}
75
+
76
+#[cfg(test)]
77
+mod tests {
78
+    use super::*;
79
+
80
+    const TEST_INPUT: &str = "input/test.txt";
81
+
82
+    #[test]
83
+    fn reads_intcode() {
84
+        assert_eq!(
85
+            read_intcode(TEST_INPUT).unwrap(),
86
+            vec![1, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50]
87
+        );
88
+    }
89
+
90
+    #[test]
91
+    fn runs_intcodes() {
92
+        let mut intcode = vec![1, 0, 0, 0, 99];
93
+        run_intcode(&mut intcode);
94
+        assert_eq!(intcode, vec![2, 0, 0, 0, 99]);
95
+
96
+        let mut intcode = vec![2, 3, 0, 3, 99];
97
+        run_intcode(&mut intcode);
98
+        assert_eq!(intcode, vec![2, 3, 0, 6, 99]);
99
+
100
+        let mut intcode = vec![2, 4, 4, 5, 99, 0];
101
+        run_intcode(&mut intcode);
102
+        assert_eq!(intcode, vec![2, 4, 4, 5, 99, 9801]);
103
+
104
+        let mut intcode = vec![1, 1, 1, 4, 99, 5, 6, 0, 99];
105
+        run_intcode(&mut intcode);
106
+        assert_eq!(intcode, vec![30, 1, 1, 4, 2, 5, 6, 0, 99]);
107
+
108
+        let mut intcode = vec![1, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50];
109
+        run_intcode(&mut intcode);
110
+        assert_eq!(intcode, vec![3500, 9, 10, 70, 2, 3, 11, 0, 99, 30, 40, 50]);
111
+    }
112
+}