#include #include #include using namespace std; #include "util.h" ostream & operator<<(ostream & os, vector & 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 & 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 _play_game(vector & players, int step) { vector 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 players(n, true); vector loosers = _play_game(players, m); if(verbose) { cout << loosers << endl; } return loosers[loosers.size()-1]; }