From c17be699102490330e0a795b6405bbe3441b66a6 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sun, 9 Dec 2018 13:27:05 +0100 Subject: [PATCH] Replace linkedlist with VecDeq. Slightly slower but a lot cleaner. --- 2018/Cargo.toml | 1 - 2018/src/day09.rs | 48 +++++++++++++---------------------------------- 2018/src/lib.rs | 2 -- 3 files changed, 13 insertions(+), 38 deletions(-) diff --git a/2018/Cargo.toml b/2018/Cargo.toml index ce108d6..c86bbc0 100644 --- a/2018/Cargo.toml +++ b/2018/Cargo.toml @@ -9,4 +9,3 @@ clap = "2.32" regex = "1.1.0" chrono = "0.4.6" itertools = "0.7.11" -intrusive-collections = "0.7.8" diff --git a/2018/src/day09.rs b/2018/src/day09.rs index 3b3734a..108fbe3 100644 --- a/2018/src/day09.rs +++ b/2018/src/day09.rs @@ -1,53 +1,31 @@ -use std::cell::Cell; +use std::collections::VecDeque; use std::io::Read; -use intrusive_collections::{LinkedList, LinkedListLink}; - use common::Solution; -struct Marble { - link: LinkedListLink, - value: Cell, -} - -impl Marble { - pub fn new(value: usize) -> Box { - Box::new(Marble { - link: LinkedListLink::new(), - value: Cell::new(value), - }) - } -} - -intrusive_adapter!(MarbleAdapter = Box: Marble { link: LinkedListLink }); - fn winning_marbles(elves: usize, marbles: usize) -> usize { let mut scores = vec![0usize; elves]; - let mut state: LinkedList<_> = LinkedList::new(MarbleAdapter::new()); - state.push_front(Marble::new(0)); - let mut current = state.front_mut(); + let mut state = VecDeque::new(); + state.push_front(0); for marble in 1..=marbles { if marble % 23 == 0 { let player = marble % elves; + for _ in 0..7 { - current.move_prev(); - if current.is_null() { - current.move_prev(); - } + let c = state.pop_back().unwrap(); + state.push_front(c); } - let to_remove = current.get().unwrap().value.get(); + let removed = state.pop_back().unwrap(); + scores[player] += removed + marble; - scores[player] += marble + to_remove; - current.remove(); + let c = state.pop_front().unwrap(); + state.push_back(c); } else { - current.move_next(); - if current.is_null() { - current.move_next(); - } - current.insert_after(Marble::new(marble)); - current.move_next(); + let c = state.pop_front().unwrap(); + state.push_back(c); + state.push_back(marble); } } diff --git a/2018/src/lib.rs b/2018/src/lib.rs index fcd6406..017ae87 100644 --- a/2018/src/lib.rs +++ b/2018/src/lib.rs @@ -1,7 +1,5 @@ extern crate chrono; #[macro_use] -extern crate intrusive_collections; -#[macro_use] extern crate itertools; extern crate regex;