110 lines
1.9 KiB
D
110 lines
1.9 KiB
D
import std.exception;
|
|
import std.range;
|
|
import std.stdio;
|
|
|
|
struct Wheel {
|
|
private string[] values;
|
|
private uint index;
|
|
|
|
invariant {
|
|
enforce(index < values.length, "index out of range");
|
|
}
|
|
|
|
this(string[] value...) in {
|
|
enforce(value.length > 0, "Cannot create a wheel with no elements");
|
|
} body {
|
|
values = value;
|
|
}
|
|
|
|
enum empty = false;
|
|
|
|
auto front() {
|
|
return values[index];
|
|
}
|
|
|
|
void popFront() {
|
|
index = (index + 1) % values.length;
|
|
}
|
|
}
|
|
|
|
struct NamedWheel {
|
|
private Wheel[char] wheels;
|
|
char m;
|
|
|
|
this(char c, Wheel w) {
|
|
add(c, w);
|
|
m = c;
|
|
}
|
|
|
|
void add(char c, Wheel w) {
|
|
wheels[c] = w;
|
|
}
|
|
|
|
enum empty = false;
|
|
|
|
auto front() {
|
|
auto v = wheels[m].front;
|
|
char c = v[0];
|
|
while ('A' <= c && c <= 'Z') {
|
|
v = wheels[c].front;
|
|
c = v[0];
|
|
}
|
|
return v;
|
|
}
|
|
|
|
void popFront() {
|
|
auto v = wheels[m].front;
|
|
wheels[m].popFront;
|
|
|
|
char c = v[0];
|
|
while ('A' <= c && c <= 'Z') {
|
|
auto d = wheels[c].front;
|
|
wheels[c].popFront;
|
|
c = d[0];
|
|
}
|
|
}
|
|
}
|
|
|
|
void group1() {
|
|
auto a = Wheel("1", "2", "3");
|
|
a.take(20).writeln;
|
|
}
|
|
|
|
void group2() {
|
|
auto a = Wheel("1", "B", "2");
|
|
auto b = Wheel("3", "4");
|
|
|
|
auto n = NamedWheel('A', a);
|
|
n.add('B', b);
|
|
|
|
n.take(20).writeln;
|
|
}
|
|
|
|
void group3() {
|
|
auto a = Wheel("1", "D", "D");
|
|
auto d = Wheel("6", "7", "8");
|
|
|
|
auto n = NamedWheel('A', a);
|
|
n.add('D', d);
|
|
|
|
n.take(20).writeln;
|
|
}
|
|
|
|
void group4() {
|
|
auto a = Wheel("1", "B", "C");
|
|
auto b = Wheel("3", "4");
|
|
auto c = Wheel("5", "B");
|
|
|
|
auto n = NamedWheel('A', a);
|
|
n.add('B', b);
|
|
n.add('C', c);
|
|
|
|
n.take(20).writeln;
|
|
}
|
|
|
|
void main() {
|
|
group1();
|
|
group2();
|
|
group3();
|
|
group4();
|
|
}
|