mirror of
https://github.com/wezm/advent-of-code.git
synced 2024-12-18 10:19:55 +00:00
Non-working day 14 part 2
This commit is contained in:
parent
85e033f369
commit
e20c424b02
1 changed files with 55 additions and 13 deletions
|
@ -1,4 +1,4 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::{fs, io};
|
use std::{fs, io};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -16,8 +16,28 @@ struct Reaction<'a> {
|
||||||
fn main() -> io::Result<()> {
|
fn main() -> io::Result<()> {
|
||||||
let input = fs::read_to_string("input/day14.txt")?;
|
let input = fs::read_to_string("input/day14.txt")?;
|
||||||
let reactions = parse_input(&input);
|
let reactions = parse_input(&input);
|
||||||
|
let map = reactions
|
||||||
|
.iter()
|
||||||
|
.map(|reaction| (reaction.output.name, reaction))
|
||||||
|
.collect::<HashMap<_, _>>();
|
||||||
|
let mut inventory = HashMap::new();
|
||||||
|
|
||||||
println!("Day 1 part 1: {}", ore_required(&reactions));
|
let ore_for_one_fuel = ore_required(&map, &mut inventory);
|
||||||
|
println!("Part 1: {}", ore_for_one_fuel);
|
||||||
|
// println!("Part 2: {}", fuel_from_ore(1000000000000, &map));
|
||||||
|
let mut fuel = 1000000000000 / ore_for_one_fuel;
|
||||||
|
println!("Part 2: {}", fuel);
|
||||||
|
let remaining_ore = 1000000000000 % ore_for_one_fuel;
|
||||||
|
|
||||||
|
// multiply left over chemicals by the number of fuel that's been extracted so far
|
||||||
|
inventory.iter_mut().for_each(|(&key, value)| if key != "FUEL" && key != "ORE" {
|
||||||
|
*value *= fuel as isize;
|
||||||
|
});
|
||||||
|
|
||||||
|
inventory.insert("ORE", remaining_ore as isize);
|
||||||
|
|
||||||
|
fuel += fuel_from_ore(remaining_ore, &map, &mut inventory);
|
||||||
|
println!("Part 2: {}", fuel);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -44,22 +64,39 @@ fn parse_material(s: &str) -> Material {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ore_required(reactions: &[Reaction]) -> usize {
|
fn ore_required<'a>(map: &'a HashMap<&'a str, &Reaction>, inventory: &mut HashMap<&'a str, isize>) -> usize {
|
||||||
// Find FUEL and work back to ORE to find paths?
|
run_reaction("FUEL", &map, inventory);
|
||||||
let map = reactions
|
|
||||||
.iter()
|
|
||||||
.map(|reaction| (reaction.output.name, reaction))
|
|
||||||
.collect::<HashMap<_, _>>();
|
|
||||||
|
|
||||||
let mut inventory = HashMap::new();
|
|
||||||
run_reaction("FUEL", &map, &mut inventory);
|
|
||||||
inventory.get("ORE").copied().unwrap_or_default().abs() as usize
|
inventory.get("ORE").copied().unwrap_or_default().abs() as usize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn fuel_from_ore<'a>(ore: usize, map: &'a HashMap<&'a str, &Reaction>, inventory: &mut HashMap<&'a str, isize>) -> usize {
|
||||||
|
let ore = ore as isize;
|
||||||
|
let mut fuel = inventory.get("FUEL").copied().unwrap_or_default();
|
||||||
|
while inventory.get("ORE").copied().unwrap_or_default().abs() < ore {
|
||||||
|
run_reaction("FUEL", &map, inventory);
|
||||||
|
if inventory.iter().any(|(&key, &value)| {
|
||||||
|
if key != "ORE" && key != "FUEL" {
|
||||||
|
value < 0
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
fuel = inventory["FUEL"];
|
||||||
|
}
|
||||||
|
|
||||||
|
dbg!(&inventory);
|
||||||
|
|
||||||
|
fuel as usize
|
||||||
|
}
|
||||||
|
|
||||||
// Run the named reaction, updating the inventory
|
// Run the named reaction, updating the inventory
|
||||||
fn run_reaction<'a>(
|
fn run_reaction<'a>(
|
||||||
name: &'a str,
|
name: &'a str,
|
||||||
tree: &'a HashMap<&'a str, &'a Reaction>,
|
tree: &'a HashMap<&'a str, &Reaction>,
|
||||||
inventory: &mut HashMap<&'a str, isize>,
|
inventory: &mut HashMap<&'a str, isize>,
|
||||||
) {
|
) {
|
||||||
let node = tree[name];
|
let node = tree[name];
|
||||||
|
@ -91,7 +128,12 @@ mod tests {
|
||||||
2 AB, 3 BC, 4 CA => 1 FUEL
|
2 AB, 3 BC, 4 CA => 1 FUEL
|
||||||
";
|
";
|
||||||
let reactions = parse_input(&input);
|
let reactions = parse_input(&input);
|
||||||
|
let map = reactions
|
||||||
|
.iter()
|
||||||
|
.map(|reaction| (reaction.output.name, reaction))
|
||||||
|
.collect::<HashMap<_, _>>();
|
||||||
|
let mut inventory = HashMap::new();
|
||||||
|
|
||||||
assert_eq!(ore_required(&reactions), 165);
|
assert_eq!(ore_required(&map, &mut inventory), 165);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue