Add D14P1
This commit is contained in:
parent
875c0959a4
commit
82a55b5a1e
10
2019/14/Cargo.toml
Normal file
10
2019/14/Cargo.toml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[package]
|
||||||
|
name = "day14"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["kageru <kageru@encode.moe>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
lazy_static = "1.4.0"
|
58
2019/14/input
Normal file
58
2019/14/input
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
8 SPJN, 2 LJRB, 1 QMDTJ => 1 TFPRF
|
||||||
|
111 ORE => 5 GCFP
|
||||||
|
5 NGCKP => 6 QXQZ
|
||||||
|
21 RGRLZ => 7 DKVN
|
||||||
|
2 DCKF => 9 FCMVJ
|
||||||
|
7 SGHSV, 4 LZPCS => 9 DQRCZ
|
||||||
|
4 QNRH => 8 WGKHJ
|
||||||
|
135 ORE => 6 BPLFB
|
||||||
|
4 SPJN, 1 DCKF, 9 KJVZ, 1 DKVN, 4 ZKVPL, 11 TFPRF, 1 CWPVT => 8 BVMK
|
||||||
|
8 TGPV, 4 MQPLD => 2 SPFZ
|
||||||
|
11 QMDTJ, 15 LVPK, 5 LZPCS => 3 KJVZ
|
||||||
|
2 RNXF, 3 MKMQ => 6 LJRB
|
||||||
|
11 RKCXJ, 4 BJHW, 2 DKDST => 3 QNRH
|
||||||
|
3 NZHP, 1 QMDTJ => 9 BCMKN
|
||||||
|
10 DQRCZ, 1 GBJF => 7 RGRLZ
|
||||||
|
2 WLKC, 1 GBJF, 7 SPJN => 5 GBWQT
|
||||||
|
4 TGPV, 1 LTSB => 2 LZPCS
|
||||||
|
6 LJRB => 4 LQHB
|
||||||
|
3 LZPCS, 3 MDTZL, 12 DLHS => 2 CBTK
|
||||||
|
1 TGPV, 1 CQPR => 9 XQZFV
|
||||||
|
26 FSQBL => 8 HQPG
|
||||||
|
9 LQHB => 1 GBJF
|
||||||
|
7 NGCKP => 5 WLKC
|
||||||
|
9 DKDST, 1 XQZFV => 9 TPZBM
|
||||||
|
144 ORE => 9 RNXF
|
||||||
|
1 LJRB => 6 CQPR
|
||||||
|
9 MKMQ, 12 RNXF => 9 JWPLZ
|
||||||
|
5 LZPCS, 28 QMDTJ, 1 QNRH => 5 LVPK
|
||||||
|
5 TGPV, 1 HQPG => 6 FCBLK
|
||||||
|
8 LVPK, 9 DQRCZ, 1 MDTZL => 6 DCKF
|
||||||
|
1 RKCXJ, 2 LZPCS, 13 LJNJ => 1 QWFG
|
||||||
|
4 DKDST, 1 XQZFV, 10 NSXFK => 4 JRDXQ
|
||||||
|
7 QWFG, 1 BVMK, 4 BJHW, 21 QNSWJ, 3 FBTW, 3 FCBLK, 59 SPFZ, 4 GBWQT => 1 FUEL
|
||||||
|
28 LZPCS, 17 NGCKP, 1 MQPLD => 5 MDTZL
|
||||||
|
1 FCBLK, 5 WGKHJ => 7 ZKVPL
|
||||||
|
7 LJNJ => 9 BLDJP
|
||||||
|
11 FSQBL, 2 BCMKN, 1 CBTK => 9 CWPVT
|
||||||
|
1 BJHW => 1 MQPLD
|
||||||
|
11 SGHSV, 3 LJNJ => 1 NGCKP
|
||||||
|
2 FSQBL, 7 FCBLK, 1 CQPR => 4 RKCXJ
|
||||||
|
1 JRDXQ => 4 SGHSV
|
||||||
|
107 ORE => 6 MKMQ
|
||||||
|
1 DQRCZ, 3 QMDTJ, 9 XQZFV => 4 FZVH
|
||||||
|
6 NSXFK, 1 MKMQ => 6 DLHS
|
||||||
|
4 CQPR, 1 RNXF, 1 HQPG => 5 DKDST
|
||||||
|
9 RNXF => 8 LTZTR
|
||||||
|
1 LTSB, 8 BLDJP => 4 SPJN
|
||||||
|
1 FCBLK => 4 LJNJ
|
||||||
|
1 NGCKP => 3 NZHP
|
||||||
|
11 LZPCS, 22 DQRCZ, 1 QWFG, 1 QXQZ, 6 DKVN, 16 FZVH, 3 MQPLD, 23 HQPG => 3 QNSWJ
|
||||||
|
26 DLHS, 1 NSXFK => 9 BJHW
|
||||||
|
3 FCBLK, 10 HQPG => 3 LTSB
|
||||||
|
10 LTZTR, 13 JWPLZ, 16 FSQBL => 4 TGPV
|
||||||
|
11 LTSB, 1 XQZFV, 3 DQRCZ => 4 CZCJ
|
||||||
|
1 HQPG, 12 XQZFV, 17 TPZBM => 6 QMDTJ
|
||||||
|
2 LTZTR => 7 FSQBL
|
||||||
|
1 GCFP, 5 BPLFB => 1 NSXFK
|
||||||
|
3 KJVZ, 1 QXQZ, 6 DKDST, 1 FCMVJ, 2 CZCJ, 1 QNRH, 7 WLKC => 4 FBTW
|
95
2019/14/src/main.rs
Normal file
95
2019/14/src/main.rs
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate lazy_static;
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::default::Default;
|
||||||
|
use std::io::{stdin, BufRead};
|
||||||
|
use std::sync::Mutex;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, Default)]
|
||||||
|
struct Element<'a> {
|
||||||
|
quantity: usize,
|
||||||
|
element: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Default)]
|
||||||
|
struct Reaction<'a> {
|
||||||
|
inputs: Vec<Element<'a>>,
|
||||||
|
output: Element<'a>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> From<&'a str> for Element<'a> {
|
||||||
|
fn from(other: &'a str) -> Self {
|
||||||
|
let mut parts = other.split(' ');
|
||||||
|
Element {
|
||||||
|
quantity: parts.next().unwrap().parse().unwrap(),
|
||||||
|
element: parts.next().unwrap(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> From<&'a str> for Reaction<'a> {
|
||||||
|
fn from(other: &'a str) -> Self {
|
||||||
|
let in_out: Vec<_> = other.split(" => ").collect();
|
||||||
|
let inputs = in_out[0].split(", ").map(|p| p.into()).collect();
|
||||||
|
let output = in_out[1].into();
|
||||||
|
Reaction { inputs, output }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref LINES: Vec<String> = stdin().lock().lines().map(|l| l.unwrap()).collect();
|
||||||
|
static ref REACTIONS: HashMap<&'static str, Reaction<'static>> = LINES
|
||||||
|
.iter()
|
||||||
|
.map::<Reaction, _>(|l| l.as_str().into())
|
||||||
|
.map(|r| (r.output.element.clone(), r))
|
||||||
|
.collect();
|
||||||
|
static ref STORAGE: Mutex<HashMap<&'static str, usize>> = Mutex::new(HashMap::new());
|
||||||
|
}
|
||||||
|
|
||||||
|
const ORE: &'static str = "ORE";
|
||||||
|
const FUEL: &'static str = "FUEL";
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("FUEL: {:?}", REACTIONS.get("FUEL"));
|
||||||
|
println!("{}", count_ingredients(FUEL, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn count_ingredients(element: &'static str, desired_quantity: usize) -> usize {
|
||||||
|
if element == ORE {
|
||||||
|
return desired_quantity;
|
||||||
|
}
|
||||||
|
let mut ores = 0;
|
||||||
|
let reaction = REACTIONS.get(&element).unwrap();
|
||||||
|
let output_quantity = reaction.output.quantity;
|
||||||
|
//dbg!(&reaction);
|
||||||
|
let num_reactions = (desired_quantity as f32 / output_quantity as f32).ceil() as usize;
|
||||||
|
//dbg!(&num_reactions);
|
||||||
|
//println!("A: {}, B: {}", get_from_storage("A"), get_from_storage("B"));
|
||||||
|
for input in &reaction.inputs {
|
||||||
|
let in_storage = get_from_storage(input.element);
|
||||||
|
let mut needed = input.quantity * num_reactions;
|
||||||
|
if in_storage >= needed {
|
||||||
|
put_into_storage(input.element, in_storage - needed);
|
||||||
|
} else {
|
||||||
|
needed -= in_storage;
|
||||||
|
put_into_storage(input.element, 0);
|
||||||
|
ores += count_ingredients(input.element, needed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//let num_reactions = (desired_quantity as f32 / output_quantity as f32).ceil() as usize;
|
||||||
|
//dbg!(&num_reactions);
|
||||||
|
let surplus = output_quantity * num_reactions - desired_quantity;
|
||||||
|
put_into_storage(element, get_from_storage(element) + surplus);
|
||||||
|
return ores;// * num_reactions;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn get_from_storage(element: &str) -> usize {
|
||||||
|
*STORAGE.lock().unwrap().get(element).unwrap_or(&0)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn put_into_storage(element: &'static str, quantity: usize) {
|
||||||
|
STORAGE.lock().unwrap().insert(element, quantity);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user