57 lines
1.4 KiB
C++
57 lines
1.4 KiB
C++
#include <iostream>
|
|
#include <string>
|
|
#include <vector>
|
|
using namespace std;
|
|
|
|
#include "util.h"
|
|
|
|
ostream & operator<<(ostream & os, vector<int> & v) {
|
|
os << "[";
|
|
for(unsigned int i = 0; i < v.size(); i++) {
|
|
os << v[i];
|
|
if(i != v.size() - 1) {
|
|
os << ", ";
|
|
}
|
|
}
|
|
os << "]";
|
|
return os;
|
|
}
|
|
|
|
int _increment_to_next_looser(const vector<bool> & players,
|
|
int start, const int step) {
|
|
int counter = 0;
|
|
// the test examples in the pdf have us start by killing the m-1th person
|
|
// offset by one for some dumb reason
|
|
int attempt = start - 1;
|
|
while(counter != step) {
|
|
attempt = (attempt + 1) % players.size();
|
|
if(players[attempt]) {
|
|
counter++;
|
|
}
|
|
}
|
|
return attempt;
|
|
}
|
|
|
|
vector<int> _play_game(vector<bool> & players, int step) {
|
|
vector<int> loosers;
|
|
int token = 0;
|
|
while(loosers.size() < players.size()) {
|
|
token = _increment_to_next_looser(players, token, step);
|
|
players[token] = false;
|
|
loosers.push_back(token);
|
|
}
|
|
return loosers;
|
|
}
|
|
|
|
int _test_run(int n, int m, bool verbose) {
|
|
if(m < 1) {
|
|
throw string("rule violation: m > 0");
|
|
}
|
|
vector<bool> players(n, true);
|
|
vector<int> loosers = _play_game(players, m);
|
|
if(verbose) {
|
|
cout << loosers << endl;
|
|
}
|
|
return loosers[loosers.size()-1];
|
|
}
|