diff options
Diffstat (limited to 'src/2020/7/mod.rs')
-rw-r--r-- | src/2020/7/mod.rs | 34 |
1 files changed, 15 insertions, 19 deletions
diff --git a/src/2020/7/mod.rs b/src/2020/7/mod.rs index fbf2c43..6199ad0 100644 --- a/src/2020/7/mod.rs +++ b/src/2020/7/mod.rs @@ -1,9 +1,9 @@ -use anyhow::Context as _; +use crate::prelude::*; -type Graph = std::collections::HashMap<String, Vec<(i64, String)>>; +type Graph = HashMap<String, Vec<(i64, String)>>; -pub fn parse(fh: std::fs::File) -> anyhow::Result<Graph> { - let input = crate::util::parse::string(fh); +pub fn parse(fh: File) -> Result<Graph> { + let input = parse::string(fh); let mut graph = Graph::new(); for line in input.lines() { let (k, v) = parse_line(line)?; @@ -12,7 +12,7 @@ pub fn parse(fh: std::fs::File) -> anyhow::Result<Graph> { Ok(graph) } -pub fn part1(graph: Graph) -> anyhow::Result<i64> { +pub fn part1(graph: Graph) -> Result<i64> { let mut colors = 0; for color in graph.keys() { if bag_contains(&graph, color, "shiny gold")? { @@ -22,14 +22,14 @@ pub fn part1(graph: Graph) -> anyhow::Result<i64> { Ok(colors) } -pub fn part2(graph: Graph) -> anyhow::Result<i64> { +pub fn part2(graph: Graph) -> Result<i64> { // subtract 1 to not count the shiny gold bag itself count_bags(&graph, "shiny gold").map(|i| i - 1) } -fn parse_line(line: &str) -> anyhow::Result<(String, Vec<(i64, String)>)> { - let main_rx = regex::Regex::new(r"^(.*) bags contain (.*)\.$").unwrap(); - let contents_rx = regex::Regex::new(r"^([0-9]+) (.*) bags?").unwrap(); +fn parse_line(line: &str) -> Result<(String, Vec<(i64, String)>)> { + let main_rx = Regex::new(r"^(.*) bags contain (.*)\.$").unwrap(); + let contents_rx = Regex::new(r"^([0-9]+) (.*) bags?").unwrap(); let captures = main_rx .captures(line) @@ -57,16 +57,12 @@ fn parse_line(line: &str) -> anyhow::Result<(String, Vec<(i64, String)>)> { captures.get(2).unwrap().as_str().to_string(), )) }) - .collect::<anyhow::Result<_>>()?, + .collect::<Result<_>>()?, )) } } -fn bag_contains( - graph: &Graph, - start: &str, - target: &str, -) -> anyhow::Result<bool> { +fn bag_contains(graph: &Graph, start: &str, target: &str) -> Result<bool> { let mut to_check = graph .get(&start.to_string()) .context("failed to find starting color in graph")? @@ -86,13 +82,13 @@ fn bag_contains( Ok(false) } -fn count_bags(graph: &Graph, color: &str) -> anyhow::Result<i64> { +fn count_bags(graph: &Graph, color: &str) -> Result<i64> { Ok(1 + graph .get(&color.to_string()) .context("failed to find starting color in graph")? .iter() .map(|(count, child)| Ok(count * count_bags(graph, child)?)) - .collect::<anyhow::Result<Vec<_>>>()? + .collect::<Result<Vec<_>>>()? .iter() .sum::<i64>()) } @@ -100,11 +96,11 @@ fn count_bags(graph: &Graph, color: &str) -> anyhow::Result<i64> { #[test] fn test() { assert_eq!( - part1(parse(crate::util::data(2020, 7).unwrap()).unwrap()).unwrap(), + part1(parse(parse::data(2020, 7).unwrap()).unwrap()).unwrap(), 169 ); assert_eq!( - part2(parse(crate::util::data(2020, 7).unwrap()).unwrap()).unwrap(), + part2(parse(parse::data(2020, 7).unwrap()).unwrap()).unwrap(), 82372 ); } |