Optimize 2020/07

This commit is contained in:
kageru 2020-12-07 12:02:51 +01:00
parent bbac9f64d4
commit 0a2c8f28a6
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2

View File

@ -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]