use super::util; pub fn solve() { let lines = util::read_file("input/day15.txt"); let starting_numbers = lines[0].split(",").map(|s| s.parse::().unwrap()).collect::>(); let part1 = play_until(2020, &starting_numbers); println!("Day X Part 1: {}", part1); let part2 = play_until(30_000_000, &starting_numbers); println!("Day X Part 2: {}", part2); } fn play_until(max_turn: usize, starting_numbers: &Vec) -> usize { // Because numbers can never be bigger than the number of turns, this works: let mut last_occurrence = vec!{0usize; max_turn}; // Note: we ignore the last number here; it will be the "previous_number" later. for i in 0..(starting_numbers.len() - 1) { let n = starting_numbers[i]; last_occurrence[n] = i + 1; } let mut previous_number = starting_numbers[starting_numbers.len() - 1]; for turn in starting_numbers.len()..max_turn { let prev_occurrence = last_occurrence[previous_number]; last_occurrence[previous_number] = turn; if prev_occurrence == 0 { previous_number = 0; } else { previous_number = turn - prev_occurrence; } // println!("Turn {}: {}", turn + 1, previous_number); } return previous_number; }