Skip to content

Instantly share code, notes, and snippets.

@CryZe
Created December 9, 2018 17:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CryZe/4e496564024cfedcaff8dbc2cac51806 to your computer and use it in GitHub Desktop.
Save CryZe/4e496564024cfedcaff8dbc2cac51806 to your computer and use it in GitHub Desktop.
use std::collections::VecDeque;
struct Circle {
deque: VecDeque<u32>,
}
impl Circle {
fn with_marbles(last_marble: u32) -> Self {
let mut deque =
VecDeque::with_capacity((last_marble + 1 - (last_marble / 23) * 2) as usize);
deque.push_back(0);
Circle { deque }
}
fn place_marble(&mut self, marble: u32) -> Option<u32> {
if marble % 23 != 0 {
self.move_cursor_clockwise();
self.deque.push_back(marble);
None
} else {
for _ in 0..7 {
self.move_cursor_counter_clockwise();
}
let removed_marble = self.deque.pop_back().unwrap();
self.move_cursor_clockwise();
Some(removed_marble + marble)
}
}
fn move_cursor_clockwise(&mut self) {
let popped = self.deque.pop_front().unwrap();
self.deque.push_back(popped);
}
fn move_cursor_counter_clockwise(&mut self) {
let popped = self.deque.pop_back().unwrap();
self.deque.push_front(popped);
}
}
pub fn part1(players: usize, last_marble: u32) -> u32 {
let mut scores = vec![0; players];
let mut circle = Circle::with_marbles(last_marble);
for (marble, player) in (1..=last_marble).zip((0..players).cycle()) {
if let Some(score) = circle.place_marble(marble) {
scores[player] += score;
}
}
scores.into_iter().max().unwrap()
}
pub fn part2(players: usize, last_marble: u32) -> u32 {
part1(players, 100 * last_marble)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment