summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2016-12-10 23:43:56 -0500
committerJune McEnroe <june@causal.agency>2020-11-22 00:14:25 -0500
commit9064da174e28ce9f56d87cda4e20b0ec02d577e1 (patch)
treede4b5e10ecda3b78174d16bed2fd46172a14c8e1
parentDay 10 (diff)
downloadaoc-9064da174e28ce9f56d87cda4e20b0ec02d577e1.tar.gz
aoc-9064da174e28ce9f56d87cda4e20b0ec02d577e1.zip
Day 10 part 2
-rw-r--r--src/bin/day10.rs28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/bin/day10.rs b/src/bin/day10.rs
index d45661e..a824f56 100644
--- a/src/bin/day10.rs
+++ b/src/bin/day10.rs
@@ -90,7 +90,7 @@ impl FromStr for Instructions {
 
 #[derive(Default)]
 struct State {
-    outputs: HashMap<Output, Vec<Chip>>,
+    outputs: HashMap<Output, Chip>,
     bots: HashMap<Bot, BotChips>,
     comparisons: HashMap<(Chip, Chip), Bot>,
 }
@@ -120,26 +120,26 @@ impl State {
             self.comparisons.insert((low, high), bot);
 
             let &(low_dest, high_dest) = instructions.bots.get(&bot).unwrap();
-            self.add_to(low_dest, low);
-            self.add_to(high_dest, high);
+            self.give_to(low_dest, low);
+            self.give_to(high_dest, high);
         }
 
         true
     }
 
-    fn add_to(&mut self, destination: Destination, chip: Chip) {
+    fn give_to(&mut self, destination: Destination, chip: Chip) {
         match destination {
             Destination::Bot(bot) => {
                 self.bots.entry(bot).or_insert_with(Default::default).add(chip);
             },
             Destination::Output(output) => {
-                self.outputs.entry(output).or_insert_with(Vec::new).push(chip);
+                self.outputs.insert(output, chip);
             },
         }
     }
 }
 
-fn solve(comparison: (Chip, Chip), input: &str) -> Option<Bot> {
+fn solve1(comparison: (Chip, Chip), input: &str) -> Option<Bot> {
     let instructions = input.parse().unwrap();
     let mut state = State::default();
     state.initialize(&instructions);
@@ -147,11 +147,23 @@ fn solve(comparison: (Chip, Chip), input: &str) -> Option<Bot> {
     state.comparisons.get(&comparison).cloned()
 }
 
+fn solve2(input: &str) -> u32 {
+    let instructions = input.parse().unwrap();
+    let mut state = State::default();
+    state.initialize(&instructions);
+    while state.step(&instructions) { }
+
+    state.outputs.get(&Output(0)).unwrap().0
+        * state.outputs.get(&Output(1)).unwrap().0
+        * state.outputs.get(&Output(2)).unwrap().0
+}
+
 fn main() {
     let mut input = String::new();
     io::stdin().read_to_string(&mut input).unwrap();
 
-    println!("Part 1: {:?}", solve((Chip(17), Chip(61)), &input));
+    println!("Part 1: {:?}", solve1((Chip(17), Chip(61)), &input));
+    println!("Part 2: {}", solve2(&input));
 }
 
 #[test]
@@ -164,5 +176,5 @@ bot 1 gives low to output 1 and high to bot 0
 bot 0 gives low to output 2 and high to output 0
 value 2 goes to bot 2
 ";
-    assert_eq!(Some(Bot(2)), solve((Chip(2), Chip(5)), input.trim()));
+    assert_eq!(Some(Bot(2)), solve1((Chip(2), Chip(5)), input.trim()));
 }
8d099) * commit: add repository argument to lookup_commit_reference (2122f6754c93be8f02bfb5704ed96c88fc9837a8) * object: add repository argument to parse_object (109cd76dd3467bd05f8d2145b857006649741d5c) * tag: add repository argument to deref_tag (a74093da5ed601a09fa158e5ba6f6f14c1142a3e) * tag: add repository argument to lookup_tag (ce71efb713f97f476a2d2ab541a0c73f684a5db3) * tree: add repository argument to lookup_tree (f86bcc7b2ce6cad68ba1a48a528e380c6126705e) * archive.c: avoid access to the_index (b612ee202a48f129f81f8f6a5af6cf71d1a9caef) * for_each_*_object: move declarations to object-store.h (0889aae1cd18c1804ba01c1a4229e516dfb9fe9b) Signed-off-by: Christian Hesse <mail@eworm.de> 2018-09-11ui-ssdiff: ban strcat()Christian Hesse Git upstream bans strcat() with commit: banned.h: mark strcat() as banned 1b11b64b815db62f93a04242e4aed5687a448748 Signed-off-by: Christian Hesse <mail@eworm.de> 2018-09-11ui-ssdiff: ban strncpy()Christian Hesse Git upstream bans strncpy() with commit: banned.h: mark strncpy() as banned e488b7aba743d23b830d239dcc33d9ca0745a9ad Signed-off-by: Christian Hesse <mail@eworm.de> 2018-09-11ui-shared: ban strcat()Christian Hesse Git upstream bans strcat() with commit: banned.h: mark strcat() as banned 1b11b64b815db62f93a04242e4aed5687a448748 To avoid compiler warnings from gcc 8.1.x we get the hard way. Signed-off-by: Christian Hesse <mail@eworm.de> 2018-09-11ui-patch: ban sprintf()Christian Hesse Git upstream bans sprintf() with commit: banned.h: mark sprintf() as banned cc8fdaee1eeaf05d8dd55ff11f111b815f673c58 Signed-off-by: Christian Hesse <mail@eworm.de> 2018-09-11ui-log: ban strncpy()Christian Hesse Git upstream bans strncpy() with commit: banned.h: mark strncpy() as banned e488b7aba743d23b830d239dcc33d9ca0745a9ad Signed-off-by: Christian Hesse <mail@eworm.de> 2018-09-11ui-log: ban strcpy()Christian Hesse Git upstream bans strcpy() with commit: automatically ban strcpy() c8af66ab8ad7cd78557f0f9f5ef6a52fd46ee6dd Signed-off-by: Christian Hesse <mail@eworm.de> 2018-09-11parsing: ban sprintf()Christian Hesse Git upstream bans sprintf() with commit: banned.h: mark sprintf() as banned cc8fdaee1eeaf05d8dd55ff11f111b815f673c58 Signed-off-by: Christian Hesse <mail@eworm.de> 2018-09-11parsing: ban strncpy()Christian Hesse Git upstream bans strncpy() with commit: banned.h: mark strncpy() as banned e488b7aba743d23b830d239dcc33d9ca0745a9ad Signed-off-by: Christian Hesse <mail@eworm.de> 2018-08-28filters: generate anchor links from markdownChristian Hesse This makes the markdown filter generate anchor links for headings. Signed-off-by: Christian Hesse <mail@eworm.de> Tested-by: jean-christophe manciot <actionmystique@gmail.com> 2018-08-03Bump version.Jason A. Donenfeld Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2018-08-03clone: fix directory traversalJason A. Donenfeld This was introduced in the initial version of this code, way back when in 2008. $ curl http://127.0.0.1/cgit/repo/objects/?path=../../../../../../../../../etc/passwd root:x:0:0:root:/root:/bin/sh ... Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> Reported-by: Jann Horn <jannh@google.com> 2018-08-03config: record repo.snapshot-prefix in the per-repo configKonstantin Ryabitsev