diff --git a/src/main.rs b/src/main.rs index 509a72b..71b4610 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ fn main() { - aoc_2018::tasks::day08::both(); + aoc_2018::tasks::day09::task1(); // aoc_2018::tasks::day08::task2(); } diff --git a/src/tasks/day09.rs b/src/tasks/day09.rs new file mode 100644 index 0000000..37a5a1e --- /dev/null +++ b/src/tasks/day09.rs @@ -0,0 +1,36 @@ +const PLAYERS: usize = 468; +const MODULO: usize = 23; +const HIGHEST_MARBLE: usize = 71843; + +pub fn task1() { + let mut player_score = [0usize; PLAYERS]; + let mut current_player = 1; + let mut current_index: usize = 0; + let mut deck: Vec = Vec::new(); + deck.push(0); + for marble in 1..=HIGHEST_MARBLE { + if marble % MODULO == 0 { + current_index = rem(current_index, 7, deck.len()); + player_score[current_player] += marble; + player_score[current_player] += deck.remove(current_index); + } else { + current_index = (current_index + 2) % deck.len(); + deck.insert(current_index, marble); + } + current_player = (current_player + 1) % PLAYERS; + } + + let result = player_score.iter().max().unwrap(); + println!("The highest score is {}", result); // 385469 too low +} + +pub fn rem(a: usize, sub: usize, m: usize) -> usize { + if sub > a { + let mut x = a as isize; + x -= sub as isize; + x = x % m as isize; + (x + m as isize) as usize + } else { + (a - sub) % m + } +} diff --git a/src/tasks/mod.rs b/src/tasks/mod.rs index 9ac735a..a8fc1a9 100644 --- a/src/tasks/mod.rs +++ b/src/tasks/mod.rs @@ -6,3 +6,4 @@ pub mod day05; pub mod day06; pub mod day07; pub mod day08; +pub mod day09;