bit of cleanup

This commit is contained in:
kageru 2022-12-21 13:39:42 +01:00
parent 791afead09
commit 1f10471413

View File

@ -1,4 +1,4 @@
#![feature(test, try_blocks, hash_drain_filter)] #![feature(test, hash_drain_filter)]
extern crate test; extern crate test;
use aoc2022::{boilerplate, common::*}; use aoc2022::{boilerplate, common::*};
use fnv::FnvHashMap as HashMap; use fnv::FnvHashMap as HashMap;
@ -19,7 +19,7 @@ fn parse_input(raw: &str) -> Parsed {
raw.lines() raw.lines()
.map(|line| { .map(|line| {
let key = &line.as_bytes()[0..4]; let key = &line.as_bytes()[0..4];
let value = line[6..].as_bytes(); let value = &line.as_bytes()[6..];
if value[0].is_ascii_digit() { if value[0].is_ascii_digit() {
return (key, Monkey::Number(parse_num(&line[6..]))); return (key, Monkey::Number(parse_num(&line[6..])));
@ -35,31 +35,25 @@ fn parse_input(raw: &str) -> Parsed {
.collect() .collect()
} }
const ROOT: &[u8] = b"root";
fn resolve_monkey(monkey: &Monkey, resolved: &HashMap<&[u8], isize>) -> Option<isize> {
Some(match monkey {
Monkey::Number(n) => *n,
Monkey::Add(a, b) => resolved.get(a)? + resolved.get(b)?,
Monkey::Sub(a, b) => resolved.get(a)? - resolved.get(b)?,
Monkey::Mul(a, b) => resolved.get(a)? * resolved.get(b)?,
Monkey::Div(a, b) => resolved.get(a)? / resolved.get(b)?,
})
}
fn part1(parsed: &Parsed) -> isize { fn part1(parsed: &Parsed) -> isize {
let mut missing = parsed.clone(); let mut missing = parsed.clone();
let mut resolved = HashMap::<&[u8], isize>::default(); let mut resolved = HashMap::<&[u8], isize>::default();
// parsed.iter().filter_map(|(&k, m)| if let Monkey::Number(n) = m { Some((k, *n)) } else { None }).collect();
while !missing.is_empty() { while !missing.is_empty() {
missing missing.drain_filter(|&k, v| resolve_monkey(v, &resolved).map(|n| resolved.insert(k, n)).is_some()).last();
.drain_filter(|&k, v| {
let o: Option<()> = try {
resolved.insert(
k,
match v {
Monkey::Number(n) => *n,
Monkey::Add(a, b) => resolved.get(a)? + resolved.get(b)?,
Monkey::Sub(a, b) => resolved.get(a)? - resolved.get(b)?,
Monkey::Mul(a, b) => resolved.get(a)? * resolved.get(b)?,
Monkey::Div(a, b) => resolved.get(a)? / resolved.get(b)?,
},
);
};
o.is_some()
})
.last();
} }
let root: &[u8] = b"root"; resolved[ROOT]
resolved[root]
} }
fn part2(parsed: &Parsed) -> usize { fn part2(parsed: &Parsed) -> usize {