50 lines
1.3 KiB
Text
50 lines
1.3 KiB
Text
class Josephus {
|
|
function : Execute(n : Int, k : Int) ~ Int {
|
|
killIdx := 0;
|
|
prisoners := Collection.IntVector->New();
|
|
for(i := 0;i < n;i+=1;){
|
|
prisoners->AddBack(i);
|
|
};
|
|
|
|
"Prisoners executed in order:"->PrintLine();
|
|
while(prisoners->Size() > 1){
|
|
killIdx := (killIdx + k - 1) % prisoners->Size();
|
|
executed := prisoners->Get(killIdx);
|
|
"{$executed} "->Print();
|
|
prisoners->Remove(killIdx);
|
|
};
|
|
'\n'->Print();
|
|
return prisoners->Get(0);
|
|
}
|
|
|
|
function : ExecuteAllButM(n : Int, k : Int, m : Int) ~ Collection.IntVector {
|
|
killIdx := 0;
|
|
prisoners := Collection.IntVector->New();
|
|
for(i := 0;i < n;i+=1;){
|
|
prisoners->AddBack(i);
|
|
};
|
|
"Prisoners executed in order:"->PrintLine();
|
|
while(prisoners->Size() > m){
|
|
killIdx := (killIdx + k - 1) % prisoners->Size();
|
|
executed := prisoners->Get(killIdx);
|
|
"{$executed} "->Print();
|
|
prisoners->Remove(killIdx);
|
|
};
|
|
'\n'->Print();
|
|
return prisoners;
|
|
}
|
|
|
|
function : Main(args : String[]) ~ Nil {
|
|
result := Execute(41, 3);
|
|
"Survivor: {$result}"->PrintLine();
|
|
|
|
results := ExecuteAllButM(41, 3, 3);
|
|
"Survivors: "->Print();
|
|
each(i : results) {
|
|
results->Get(i)->Print();
|
|
if(i + 1 < results->Size()) {
|
|
' '->Print();
|
|
};
|
|
};
|
|
}
|
|
}
|