Replace linkedlist with VecDeq.

Slightly slower but a lot cleaner.
This commit is contained in:
2018-12-09 13:27:05 +01:00
parent 9b287a0098
commit c17be69910
3 changed files with 13 additions and 38 deletions

View File

@@ -9,4 +9,3 @@ clap = "2.32"
regex = "1.1.0"
chrono = "0.4.6"
itertools = "0.7.11"
intrusive-collections = "0.7.8"

View File

@@ -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<usize>,
}
impl Marble {
pub fn new(value: usize) -> Box<Self> {
Box::new(Marble {
link: LinkedListLink::new(),
value: Cell::new(value),
})
}
}
intrusive_adapter!(MarbleAdapter = Box<Marble>: 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);
}
}

View File

@@ -1,7 +1,5 @@
extern crate chrono;
#[macro_use]
extern crate intrusive_collections;
#[macro_use]
extern crate itertools;
extern crate regex;