28 lines
685 B
D
28 lines
685 B
D
import std.stdio, std.algorithm, std.array, std.string, std.range;
|
|
|
|
T pop(T)(ref T[] items, in size_t i) pure /*nothrow*/ @safe /*@nogc*/ {
|
|
auto aux = items[i];
|
|
items = items.remove(i);
|
|
return aux;
|
|
}
|
|
|
|
string josephus(in int n, in int k) pure /*nothrow*/ @safe {
|
|
auto p = n.iota.array;
|
|
int i;
|
|
immutable(int)[] seq;
|
|
while (!p.empty) {
|
|
i = (i + k - 1) % p.length;
|
|
seq ~= p.pop(i);
|
|
}
|
|
|
|
return format("Prisoner killing order:\n%(%(%d %)\n%)." ~
|
|
"\nSurvivor: %d",
|
|
seq[0 .. $ - 1].chunks(20), seq[$ - 1]);
|
|
}
|
|
|
|
void main() /*@safe*/ {
|
|
josephus(5, 2).writeln;
|
|
writeln;
|
|
josephus(41, 3).writeln;
|
|
}
|