31 lines
674 B
D
31 lines
674 B
D
import std.stdio;
|
|
|
|
void main() {
|
|
auto sizes = [8, 24, 52, 100, 1020, 1024, 10_000];
|
|
foreach(s; sizes) {
|
|
writefln("%5s : %5s", s, perfectShuffle(s));
|
|
}
|
|
}
|
|
|
|
int perfectShuffle(int size) {
|
|
import std.exception : enforce;
|
|
enforce(size%2==0);
|
|
|
|
import std.algorithm : copy, equal;
|
|
import std.range;
|
|
int[] orig = iota(0, size).array;
|
|
|
|
int[] process;
|
|
process.length = size;
|
|
copy(orig, process);
|
|
|
|
for(int count=1; true; count++) {
|
|
process = roundRobin(process[0..$/2], process[$/2..$]).array;
|
|
|
|
if (equal(orig, process)) {
|
|
return count;
|
|
}
|
|
}
|
|
|
|
assert(false, "How did this get here?");
|
|
}
|