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" regex = "1.1.0"
chrono = "0.4.6" chrono = "0.4.6"
itertools = "0.7.11" 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 std::io::Read;
use intrusive_collections::{LinkedList, LinkedListLink};
use common::Solution; 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 { fn winning_marbles(elves: usize, marbles: usize) -> usize {
let mut scores = vec![0usize; elves]; let mut scores = vec![0usize; elves];
let mut state: LinkedList<_> = LinkedList::new(MarbleAdapter::new()); let mut state = VecDeque::new();
state.push_front(Marble::new(0)); state.push_front(0);
let mut current = state.front_mut();
for marble in 1..=marbles { for marble in 1..=marbles {
if marble % 23 == 0 { if marble % 23 == 0 {
let player = marble % elves; let player = marble % elves;
for _ in 0..7 { for _ in 0..7 {
current.move_prev(); let c = state.pop_back().unwrap();
if current.is_null() { state.push_front(c);
current.move_prev();
}
} }
let to_remove = current.get().unwrap().value.get(); let removed = state.pop_back().unwrap();
scores[player] += removed + marble;
scores[player] += marble + to_remove; let c = state.pop_front().unwrap();
current.remove(); state.push_back(c);
} else { } else {
current.move_next(); let c = state.pop_front().unwrap();
if current.is_null() { state.push_back(c);
current.move_next(); state.push_back(marble);
}
current.insert_after(Marble::new(marble));
current.move_next();
} }
} }

View File

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