Day 7
This commit is contained in:
parent
8b702bca9f
commit
d1c0ec56de
2 changed files with 80 additions and 0 deletions
79
src/day7.rs
Normal file
79
src/day7.rs
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
use aoc_runner_derive::{aoc, aoc_generator};
|
||||||
|
use std::collections::{HashMap, HashSet, VecDeque};
|
||||||
|
|
||||||
|
pub struct Data {
|
||||||
|
fwd: HashMap<String, Vec<(usize, String)>>,
|
||||||
|
rev: HashMap<String, Vec<(usize, String)>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
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<String> = 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;
|
||||||
|
}
|
|
@ -5,4 +5,5 @@ pub mod day3;
|
||||||
pub mod day4;
|
pub mod day4;
|
||||||
pub mod day5;
|
pub mod day5;
|
||||||
pub mod day6;
|
pub mod day6;
|
||||||
|
pub mod day7;
|
||||||
aoc_lib! { year = 2020 }
|
aoc_lib! { year = 2020 }
|
||||||
|
|
Loading…
Reference in a new issue