pub fn day7_part1(input: &str) -> String { emit_tachyon(input).0.to_string() } pub fn day7_part2(input: &str) -> String { emit_tachyon(input).1.to_string() } fn emit_tachyon(input: &str) -> (u64, u64) { let (start_col, splittermap) = parse(input); let mut beam_cols = vec![0; splittermap[0].len()]; beam_cols[start_col] = 1; let mut splitcount = 0; for splitter_row in splittermap { let mut next_beam_cols = vec![0; splitter_row.len()]; next_beam_cols[0] = beam_cols[0]; next_beam_cols[splitter_row.len() - 1] = beam_cols[splitter_row.len() - 1]; for col in 1..splitter_row.len() - 1 { if splitter_row[col] { next_beam_cols[col - 1] += beam_cols[col]; next_beam_cols[col + 1] += beam_cols[col]; if beam_cols[col] != 0 { splitcount += 1; } } else { next_beam_cols[col] += beam_cols[col] } } beam_cols = next_beam_cols; } (splitcount, beam_cols.into_iter().sum()) } //true: splitter fn parse(input: &str) -> (usize, Vec>) { let start_col = input .chars() .enumerate() .find(|(_, c)| *c == 'S') .unwrap() .0; let splittermap = input .lines() .map(|l| l.chars().map(|c| c == '^').collect()) .collect(); (start_col, splittermap) }