1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
use rand::{
distributions::{Distribution, Standard},
Rng
};
#[derive(PartialEq)]
enum MoveDirection {
Front,
Back,
Down,
Up,
Right,
Left,
}
enum MoveModifier {
None,
Twice,
Prime,
}
pub struct Move {
direction: MoveDirection,
modifier: MoveModifier,
}
// https://stackoverflow.com/questions/48490049
impl Distribution<MoveDirection> for Standard {
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> MoveDirection {
use MoveDirection::*;
match rng.gen_range(0, 6) {
0 => Front,
1 => Back,
2 => Down,
3 => Up,
4 => Right,
_ => Left,
}
}
}
impl Distribution<MoveModifier> for Standard {
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> MoveModifier {
use MoveModifier::*;
match rng.gen_range(0, 3) {
0 => None,
1 => Twice,
_ => Prime,
}
}
}
impl Move {
pub fn sequence(n: usize) -> Vec<Move> {
let mut sequence: Vec<Move> = Vec::with_capacity(n);
while sequence.len() != n {
let direction = rand::random::<MoveDirection>();
let modifier = rand::random::<MoveModifier>();
if let Some(l) = sequence.last() {
if l.direction == direction {
continue;
}
}
sequence.push(Move { direction, modifier });
}
sequence
}
pub fn string_sequence(n: usize) -> String {
let seq = Move::sequence(n);
seq.iter().map(|m| m.to_string() + " ").collect::<Vec<String>>().join(" ")
}
}
use std::fmt;
impl fmt::Display for Move {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use MoveDirection::*;
use MoveModifier::*;
let letter = match self.direction {
Front => "F",
Back => "B",
Down => "D",
Up => "U",
Right => "R",
Left => "L",
};
let modifier = match self.modifier {
None => "",
Twice => "2",
Prime => "'",
};
write!(f, "{}{}", letter, modifier)
}
}
|