From 8c72063cd4b33fd0124492cfca4f8b317da413de Mon Sep 17 00:00:00 2001 From: Avril Date: Mon, 7 Dec 2020 17:25:04 +0000 Subject: [PATCH] fuck this i give up filtered --- day7/src/main.rs | 29 ---------------- {day7 => fuck7}/Cargo.toml | 0 {day7 => fuck7}/src/bag.rs | 30 +++++++++++++++-- fuck7/src/main.rs | 64 ++++++++++++++++++++++++++++++++++++ {day7 => fuck7}/src/parse.rs | 0 5 files changed, 91 insertions(+), 32 deletions(-) delete mode 100644 day7/src/main.rs rename {day7 => fuck7}/Cargo.toml (100%) rename {day7 => fuck7}/src/bag.rs (76%) create mode 100644 fuck7/src/main.rs rename {day7 => fuck7}/src/parse.rs (100%) diff --git a/day7/src/main.rs b/day7/src/main.rs deleted file mode 100644 index 6b68161..0000000 --- a/day7/src/main.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![feature(str_split_once)] - -#![allow(dead_code)] - -use std::{ - io::BufReader, - fs::OpenOptions, - collections::HashSet, -}; - -#[cfg(feature="test")] -const INPUT: &str ="input-test"; -#[cfg(not(feature="test"))] -const INPUT: &str = "input"; - - -mod parse; -mod bag; - -fn main() -> Result<(), Box> { - let parsed: HashSet<_> = parse::parse(BufReader::new(OpenOptions::new().read(true).open(INPUT)?)).collect(); - #[cfg(debug_assertions)] - for x in parsed.iter() { - eprintln!("{:?}", x); - } - - - Ok(()) -} diff --git a/day7/Cargo.toml b/fuck7/Cargo.toml similarity index 100% rename from day7/Cargo.toml rename to fuck7/Cargo.toml diff --git a/day7/src/bag.rs b/fuck7/src/bag.rs similarity index 76% rename from day7/src/bag.rs rename to fuck7/src/bag.rs index 93d181e..8363791 100644 --- a/day7/src/bag.rs +++ b/fuck7/src/bag.rs @@ -20,6 +20,12 @@ impl Borrow for Rule &self.bag } } +impl Borrow for Rule +{ + fn borrow(&self) -> &str { + self.name() + } +} impl Hash for Rule { fn hash(&self, state: &mut H) { @@ -37,7 +43,7 @@ impl Rule /// Find the rules for each inner bag within this context pub fn inner_rules<'a>(&'a self, hashes: &'a Bags) -> impl Iterator + 'a { - self.contains.iter().filter_map(move |(_, re)| hashes.get(re)) + self.contains.iter().filter_map(move |(n, re)| Some(std::iter::repeat(hashes.get(re)?).take(*n))).flatten() } #[inline] pub fn new(bag: impl Into, contains: impl IntoIterator) -> Self { @@ -59,6 +65,7 @@ impl Rule } } +#[derive(Debug)] pub struct RuleIterator<'a> { base: std::slice::Iter<'a, (usize, BagRef)>, @@ -66,6 +73,20 @@ pub struct RuleIterator<'a> held: Vec<&'a Rule>, } +impl<'a> RuleIterator<'a> +{ + pub fn search(self, s: impl AsRef) -> Option<&'a Rule> + { + let s= s.as_ref(); + for rule in self { + if rule.name() == s { + return Some(rule); + } + } + None + } +} + impl<'a> Iterator for RuleIterator<'a> { type Item = &'a Rule; @@ -73,8 +94,11 @@ impl<'a> Iterator for RuleIterator<'a> { if self.held.is_empty() { match self.base.next() { - Some((_, re)) => { - self.held.push(self.hashes.get(re).unwrap()); + Some((n, re)) => { + let ins = self.hashes.get(re).unwrap(); + for _ in 0..*n { + self.held.push(ins); + } }, None => return None, } diff --git a/fuck7/src/main.rs b/fuck7/src/main.rs new file mode 100644 index 0000000..aa7565c --- /dev/null +++ b/fuck7/src/main.rs @@ -0,0 +1,64 @@ +#![feature(str_split_once)] + +#![allow(dead_code)] + +use std::{ + io::BufReader, + fs::OpenOptions, + collections::HashSet, +}; + +#[cfg(feature="test")] +const INPUT: &str ="input-test2"; +#[cfg(not(feature="test"))] +const INPUT: &str = "input"; + +const NEEDLE: &str = "shiny gold"; + +mod parse; +mod bag; + +fn cnt_rules(rule: &bag::Rule, set: &HashSet) -> usize +{ + let mut already_done: HashSet<&bag::Rule> = HashSet::new(); + rule.all_rules(set).map(|x| { + let mut o = cnt_rules(x, set) + x.inner_rules(set).count(); + + if already_done.insert(x) || true { + if o > 0 { + eprintln!("{:?} -> {}", x, o); + o+=1; + } else if !already_done.contains(x) { + eprintln!("{:?} -> {}", x ,1); + return 1; + } + o + } else { + 0 + } + }).sum() +} + +fn main() -> Result<(), Box> { + let parsed: HashSet<_> = parse::parse(BufReader::new(OpenOptions::new().read(true).open(INPUT)?)).collect(); + + let mut found=0; + for rule in parsed.iter() { + #[cfg(debug_assertions)] + eprintln!("{:?}", rule); + + if rule.name() != NEEDLE { + if rule.all_rules(&parsed).search(NEEDLE).is_some() { + found +=1; + } + } + } + + println!("{}", found); + + //#[cfg(feature="part2")] + { + println!("{}", cnt_rules(parsed.get(NEEDLE).unwrap(), &parsed)); + } + Ok(()) +} diff --git a/day7/src/parse.rs b/fuck7/src/parse.rs similarity index 100% rename from day7/src/parse.rs rename to fuck7/src/parse.rs