summaryrefslogtreecommitdiff
path: root/2024/day19.rs
diff options
context:
space:
mode:
Diffstat (limited to '2024/day19.rs')
-rw-r--r--2024/day19.rs90
1 files changed, 90 insertions, 0 deletions
diff --git a/2024/day19.rs b/2024/day19.rs
new file mode 100644
index 0000000..5060dff
--- /dev/null
+++ b/2024/day19.rs
@@ -0,0 +1,90 @@
+#![allow(dead_code)]
+#![allow(unused_variables)]
+#![allow(unused_mut)]
+use std::collections::HashSet;
+use std::env;
+use std::fs::File;
+use std::io::Read;
+
+fn dfs(design: &str, tokens: &Vec<&str>) -> i64 {
+ if design.len() == 0 {
+ return 1;
+ }
+
+ for t in tokens {
+ if design.starts_with(t) {
+ let ret = dfs(&design[t.len()..], tokens);
+ if ret == 1 {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+//fn bfs(design: &str, tokens: &Vec<&str>) -> i64 {
+// let mut hs_new: HashSet<(i64, &str)> = HashSet::new();
+// hs_new.insert((1,design));
+//
+// let mut ret = 0;
+// loop {
+// let mut hs = hs_new.clone();
+// hs_new.clear();
+//
+// for (n,d) in hs.clone() {
+// for t in tokens {
+// if &d == t {
+// ret += 1;
+// } else if d.starts_with(t) {
+// hs_new.insert((n+1,&d[t.len()..]));
+// }
+// }
+// }
+//
+// println!("{:?}", hs);
+// if hs_new.len() == 0 {
+// return ret;
+// }
+// }
+//}
+
+fn main() {
+ let args: Vec<String> = env::args().collect();
+ let filename = if args.len() == 1 {
+ "in/".to_owned() + args[0].split('/').last().unwrap() + ".pzl"
+ } else {
+ args[1].clone()
+ };
+ let mut f = File::open(filename).expect("cannot open file");
+ let mut content = String::new();
+ f.read_to_string(&mut content).expect("cannot read file");
+ let (para1, para2) = content.trim_end().split_once("\n\n").unwrap();
+
+ let mut tokens: Vec<&str> = Vec::new();
+ for s in para1.split(", ") {
+ tokens.push(s);
+ }
+
+ let mut designs: Vec<&str> = Vec::new();
+ for s in para2.split("\n") {
+ designs.push(s);
+ }
+ //println!("{:?}", tokens);
+ //println!("{:?}", designs);
+
+ let mut res1 = 0;
+ let mut res2 = 0;
+ for d in designs {
+ res1 += dfs(d, &tokens);
+ //println!("{}", d);
+ //let ret = bfs(d, &tokens);
+ //res2 += ret;
+ //println!("{}", ret);
+ }
+
+
+ println!("res1: {}", res1);
+ println!("res2: {}", res2);
+ //assert_eq!(res1, 240);
+ //assert_eq!(res2, );
+}