From d1c0ec56ded915d92bd7307efdfdfff233ad52cd Mon Sep 17 00:00:00 2001 From: Daniel Seiller Date: Mon, 7 Dec 2020 14:04:31 +0100 Subject: [PATCH] Day 7 --- src/day7.rs | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 2 files changed, 80 insertions(+) create mode 100644 src/day7.rs diff --git a/src/day7.rs b/src/day7.rs new file mode 100644 index 0000000..0cfaa7e --- /dev/null +++ b/src/day7.rs @@ -0,0 +1,79 @@ +use aoc_runner_derive::{aoc, aoc_generator}; +use std::collections::{HashMap, HashSet, VecDeque}; + +pub struct Data { + fwd: HashMap>, + rev: HashMap>, +} + +impl Data { + pub fn new() -> Data { + Data { + fwd: HashMap::new(), + rev: HashMap::new(), + } + } +} + +#[aoc_generator(day7)] +pub fn input_generator(input: &str) -> Data { + let mut ret = Data::new(); + for line in input.lines() { + let mut line = line.to_owned(); + line = line.replace("contain", ""); + line = line.replace("bags", ""); + line = line.replace("bag", ""); + line = line.replace(",", ""); + line = line.replace(".", ""); + while line.contains(" ") { + line = line.replace(" ", " "); + } + line = line.trim().to_owned(); + let mut l: VecDeque = line + .split_ascii_whitespace() + .map(|s| s.to_owned()) + .collect(); + let outer_color: String = [l.pop_front().unwrap(), l.pop_front().unwrap()].join(" "); + while let (Some(n), Some(c1), Some(c2)) = (l.pop_front(), l.pop_front(), l.pop_front()) { + let n: usize = n.parse().unwrap(); + let inner_color = vec![c1.to_owned(), c2.to_owned()].join(" "); + ret.fwd + .entry(outer_color.clone()) + .or_default() + .push((n, inner_color.clone())); + ret.rev + .entry(inner_color.clone()) + .or_default() + .push((n, outer_color.clone())); + } + } + ret +} + +#[aoc(day7, part1)] +pub fn solve_part1(input: &Data) -> usize { + let mut cnt = 0; + let mut q = VecDeque::new(); + q.push_back("shiny gold".to_owned()); + while let Some(c) = q.pop_front() { + for (_, nc) in input.rev.get(&c).iter().map(|v| v.iter()).flatten() { + cnt += 1; + q.push_back(nc.clone()); + } + } + return cnt; +} + +#[aoc(day7, part2)] +pub fn solve_part2(input: &Data) -> usize { + let mut cnt = 0; + let mut q = VecDeque::new(); + q.push_back((1, "shiny gold".to_owned())); + while let Some((o_n, c)) = q.pop_front() { + for (n, nc) in input.fwd.get(&c).iter().map(|v| v.iter()).flatten() { + cnt += n * o_n; + q.push_back((n * o_n, nc.clone())); + } + } + return cnt; +} diff --git a/src/lib.rs b/src/lib.rs index 349216a..b9a72e2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,4 +5,5 @@ pub mod day3; pub mod day4; pub mod day5; pub mod day6; +pub mod day7; aoc_lib! { year = 2020 }