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(); }; }; } }