#![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 = 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, ); }