mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Replace linkedlist with VecDeq.
Slightly slower but a lot cleaner.
This commit is contained in:
@@ -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"
|
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user