use std::{ collections::{HashMap, HashSet}, mem::swap, }; fn main() { let input = include_str!("../../input.txt").trim(); let input: Vec<&str> = input.trim().split("\n").collect(); // let width = input[0].len() as u64; let start = input[0].find("S").unwrap() as u64; let splitters_map: Vec> = input[0..input.len()] .iter() .enumerate() .map(|(i, line)| if i % 2 != 0 { "" } else { line }) .filter(|line| line != &"") .map(|line| { line.chars() .enumerate() .fold(HashSet::new(), |mut s, (i, char)| { if char == '^' { s.insert(i as u64); } s }) }) .collect(); let timelines = { let mut timelines: HashMap = HashMap::new(); timelines.insert(start, 1); let mut timelines_new: HashMap = HashMap::new(); for splitters in splitters_map { for (pos, amount) in &timelines { if splitters.contains(&pos) { let m1 = timelines_new.entry(pos - 1).or_insert(0); *m1 += amount; let p1 = timelines_new.entry(pos + 1).or_insert(0); *p1 += amount; } else { let e = timelines_new.entry(*pos).or_insert(0); *e += amount; } } // for pos in 0..width as u64 { // if splitters.contains(&pos) { // print!("^"); // } else if timelines_new.contains_key(&pos) { // print!("|"); // } else { // print!("."); // } // } // print!("\n\n"); swap(&mut timelines, &mut timelines_new); timelines_new.clear(); } timelines }; // println!("{:?}", timelines); println!("{}", timelines.iter().fold(0, |acc, v| { acc + v.1 })) }