[rs] Clean up 2022_16 part 1
This commit is contained in:
parent
379ad232a4
commit
0c1fffb037
1 changed files with 16 additions and 17 deletions
|
|
@ -77,7 +77,6 @@ impl OpenSet {
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Dp1 {
|
struct Dp1 {
|
||||||
valves: usize,
|
|
||||||
powers: usize,
|
powers: usize,
|
||||||
elems: Vec<u32>,
|
elems: Vec<u32>,
|
||||||
}
|
}
|
||||||
|
|
@ -87,11 +86,7 @@ impl Dp1 {
|
||||||
let valves = valves.len();
|
let valves = valves.len();
|
||||||
let powers = powerset.len();
|
let powers = powerset.len();
|
||||||
let elems = vec![0; valves * powers];
|
let elems = vec![0; valves * powers];
|
||||||
Self {
|
Self { powers, elems }
|
||||||
valves,
|
|
||||||
powers,
|
|
||||||
elems,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get(&self, valve_id: usize, open: OpenSet) -> u32 {
|
fn get(&self, valve_id: usize, open: OpenSet) -> u32 {
|
||||||
|
|
@ -107,20 +102,14 @@ impl Dp1 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn solve(input: String) {
|
fn solve_part_1(names: &HashMap<&str, usize>, valves: &[Valve], powerset: &[OpenSet]) -> u32 {
|
||||||
let valves = input.lines().map(parse_valve).collect::<Vec<_>>();
|
|
||||||
|
|
||||||
let (names, valves) = prepare_valves(valves);
|
|
||||||
let powerset = OpenSet::powerset(&valves);
|
|
||||||
eprintln!("Powerset has size {}", powerset.len());
|
|
||||||
|
|
||||||
// DP state consists of:
|
// DP state consists of:
|
||||||
// - The current minute
|
// - The current minute
|
||||||
// - The current valve
|
// - The current valve
|
||||||
// - The current set of open/closed valves
|
// - The current set of open/closed valves
|
||||||
|
|
||||||
let mut prev = Dp1::new(&valves, &powerset);
|
let mut prev = Dp1::new(valves, powerset);
|
||||||
let mut curr = Dp1::new(&valves, &powerset);
|
let mut curr = Dp1::new(valves, powerset);
|
||||||
|
|
||||||
// Given valve v in minute t with set s, you can either...
|
// Given valve v in minute t with set s, you can either...
|
||||||
// - Go to another neighbouring valve v', points: points[v', t-1, s]
|
// - Go to another neighbouring valve v', points: points[v', t-1, s]
|
||||||
|
|
@ -133,7 +122,7 @@ pub fn solve(input: String) {
|
||||||
curr.clear();
|
curr.clear();
|
||||||
|
|
||||||
for (valve_id, valve) in valves.iter().enumerate() {
|
for (valve_id, valve) in valves.iter().enumerate() {
|
||||||
for open in &powerset {
|
for open in powerset {
|
||||||
let mut score = valve
|
let mut score = valve
|
||||||
.next
|
.next
|
||||||
.iter()
|
.iter()
|
||||||
|
|
@ -152,6 +141,16 @@ pub fn solve(input: String) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let part1 = curr.get(names["AA"], OpenSet::ALL_CLOSED);
|
curr.get(names["AA"], OpenSet::ALL_CLOSED)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn solve(input: String) {
|
||||||
|
let valves = input.lines().map(parse_valve).collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let (names, valves) = prepare_valves(valves);
|
||||||
|
let powerset = OpenSet::powerset(&valves);
|
||||||
|
eprintln!("Powerset has size {}", powerset.len());
|
||||||
|
|
||||||
|
let part1 = solve_part_1(&names, &valves, &powerset);
|
||||||
println!("Part 1: {part1}");
|
println!("Part 1: {part1}");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue