41 lines
1.3 KiB
Rust
41 lines
1.3 KiB
Rust
use super::util;
|
|
|
|
pub fn solve() {
|
|
let lines = util::read_file("input/day15.txt");
|
|
let starting_numbers = lines[0].split(",").map(|s| s.parse::<usize>().unwrap()).collect::<Vec<_>>();
|
|
|
|
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>) -> 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;
|
|
|
|
} |