summaryrefslogtreecommitdiffstats
path: root/src/2020/7/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/2020/7/mod.rs')
-rw-r--r--src/2020/7/mod.rs34
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
);
}