Optimize 2020/07
This commit is contained in:
parent
bbac9f64d4
commit
0a2c8f28a6
|
@ -5,7 +5,7 @@ use itertools::Itertools;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let input = parse_input(&read_input());
|
let input = parse_input(&read_input());
|
||||||
println!("Part 1: {}", part1(&input, "shiny gold").len());
|
println!("Part 1: {}", part1(&input, "shiny gold", &mut HashSet::new()).len());
|
||||||
println!("Part 2: {}", part2(&input, "shiny gold"));
|
println!("Part 2: {}", part2(&input, "shiny gold"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,16 +48,12 @@ fn read_input() -> String {
|
||||||
std::fs::read_to_string("input").unwrap()
|
std::fs::read_to_string("input").unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn part1(bags: &[Bag], color: &str) -> HashSet<String> {
|
fn part1<'a>(bags: &[Bag], color: &str, seen: &'a mut HashSet<String>) -> &'a mut HashSet<String> {
|
||||||
let mut colors = HashSet::new();
|
|
||||||
for bag in bags.iter().filter(|bag| bag.contents.iter().find(|b| b.color == color).is_some()) {
|
for bag in bags.iter().filter(|bag| bag.contents.iter().find(|b| b.color == color).is_some()) {
|
||||||
println!("Containing bag: {}", &bag.color);
|
seen.insert(bag.color.clone());
|
||||||
colors.insert(bag.color.clone());
|
part1(bags, &bag.color, seen);
|
||||||
for c in part1(bags, &bag.color) {
|
|
||||||
colors.insert(c.to_owned());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
colors
|
seen
|
||||||
}
|
}
|
||||||
|
|
||||||
fn part2(bags: &[Bag], color: &str) -> usize {
|
fn part2(bags: &[Bag], color: &str) -> usize {
|
||||||
|
@ -95,7 +91,7 @@ dotted black bags contain no other bags.";
|
||||||
#[test]
|
#[test]
|
||||||
fn part1_test() {
|
fn part1_test() {
|
||||||
let input = parse_input(TEST_INPUT);
|
let input = parse_input(TEST_INPUT);
|
||||||
assert_eq!(part1(&input, "shiny gold").len(), 4);
|
assert_eq!(part1(&input, "shiny gold", &mut HashSet::new()).len(), 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
const TEST_INPUT_2: &str = "shiny gold bags contain 2 dark red bags.
|
const TEST_INPUT_2: &str = "shiny gold bags contain 2 dark red bags.
|
||||||
|
@ -123,7 +119,7 @@ dark violet bags contain no other bags.";
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_part1(b: &mut test::Bencher) {
|
fn bench_part1(b: &mut test::Bencher) {
|
||||||
let bags = parse_input(&read_input());
|
let bags = parse_input(&read_input());
|
||||||
b.iter(|| assert_eq!(part1(black_box(&bags), "shiny gold").len(), 226))
|
b.iter(|| assert_eq!(part1(black_box(&bags), "shiny gold", &mut HashSet::new()).len(), 226))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[bench]
|
#[bench]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user