use std::error::Error; use std::fs; pub fn both(filename: &str) -> Result<(), Box> { let contents = fs::read_to_string(filename)?; let lines = contents.lines().collect(); let trees01 = calc_trees(&lines, 3, 1); println!("Encountered {} trees while going down", trees01); let trees02 = calc_trees(&lines, 1, 1) * trees01 * calc_trees(&lines, 5, 1) * calc_trees(&lines, 7, 1) * calc_trees(&lines, 1, 2); println!("Part 2: {}", trees02); Ok(()) } fn calc_trees(contents: &Vec<&str>, right: usize, down: usize) -> u64 { let mut trees = 0; for height in 0..contents.len() { if height % down != 0 { continue; } let x = height/down * right; let row = contents[height].repeat( x / contents[height].len() + 1); if row.as_bytes()[x] == "#".as_bytes()[0] { trees += 1; } } return trees }