summary refs log tree commit diff homepage
path: root/2017/src/bin
diff options
context:
space:
mode:
Diffstat (limited to '2017/src/bin')
-rw-r--r--2017/src/bin/day08.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/2017/src/bin/day08.rs b/2017/src/bin/day08.rs
new file mode 100644
index 0000000..e5a9ad0
--- /dev/null
+++ b/2017/src/bin/day08.rs
@@ -0,0 +1,57 @@
+use std::collections::HashMap;
+use std::io::{self, Read};
+
+fn solve1(input: &str) -> i32 {
+    let mut regs = HashMap::new();
+    for line in input.lines() {
+        let mut words = line.split_whitespace();
+        let dest = words.next().unwrap();
+        let op = words.next().unwrap();
+        let val = words.next().unwrap();
+        assert_eq!(Some("if"), words.next());
+        let src = words.next().unwrap();
+        let cmp = words.next().unwrap();
+        let rhs = words.next().unwrap();
+
+        let mut val: i32 = val.parse().unwrap();
+        if op == "dec" {
+            val = -val;
+        }
+        let rhs: i32 = rhs.parse().unwrap();
+        let src = *regs.entry(src.to_owned()).or_insert(0);
+        let dest = regs.entry(dest.to_owned()).or_insert(0);
+
+        let cond = match cmp {
+            "==" => src == rhs,
+            "!=" => src != rhs,
+            "<=" => src <= rhs,
+            ">=" => src >= rhs,
+            "<" => src < rhs,
+            ">" => src > rhs,
+            _ => unimplemented!(),
+        };
+        if cond {
+            *dest += val;
+        }
+    }
+    regs.values().cloned().max().unwrap()
+}
+
+fn main() {
+    let mut input = String::new();
+    io::stdin().read_to_string(&mut input).unwrap();
+
+    println!("Part 1: {}", solve1(&input));
+}
+
+#[test]
+fn part1() {
+    assert_eq!(1, solve1(
+"\
+b inc 5 if a > 1
+a inc 1 if b < 5
+c dec -10 if a >= 1
+c inc -20 if c == 10
+"
+    ));
+}